最推荐、最规范的方法是使用 arcurl + GetOneArchive 的组合,下面我将为你详细介绍几种方法,从最佳实践到不推荐的“曲线救国”方法。

(图片来源网络,侵删)
最佳实践(强烈推荐)
这是最标准、最高效的方法,适用于列表页调用单篇文章的完整内容,最新文章”、“热门文章”等模块。
核心思路:
- 使用
arclist获取文章的 ID (id)。 - 使用
dede:field标签配合function函数,根据 ID 调用GetOneArchive方法获取文章的完整内容。
示例代码:
假设你想要在首页调用一篇指定 ID 的文章(ID=1)的完整内容。

(图片来源网络,侵删)
{dede:arclist idlist='1' titlelen='50'}
<h2><a href="[field:arcurl/]">[field:title/]</a></h2>
<!-- 使用 function 调用 PHP 函数获取文章内容 -->
[field:id function="GetOneArchive(@me, 'content')"/]
{/dede:arclist}
代码详解:
{dede:arclist idlist='1'}: 我们只指定要获取 ID 为 1 的文章。idlist参数可以指定多个 ID,用逗号隔开,如'1,3,5'。[field:id function="GetOneArchive(@me, 'content')/"]: 这是核心部分。field:id: 获取当前文章的 ID。function="...": 调用一个自定义的 PHP 函数。@me: 这是arclist循环中当前文章的 ID 值。GetOneArchive(@me, 'content'): 这是一个自定义函数,你需要将其添加到/include/extend.func.php文件中。
步骤 1:创建自定义函数
打开你的 DedeCMS 根目录下的 /include/extend.func.php 文件(如果不存在,请创建这个文件),在文件末尾添加以下 PHP 函数代码:
/**
* 根据文章ID获取文章的完整内容
* @param int $aid 文章ID
* @param string $field 需要获取的字段名,这里固定为 'body' 或 'content'
* @return string 文章内容
*/
function GetOneArchive($aid, $field = 'body') {
global $dsql;
if (empty($aid)) {
return '';
}
// 从 dede_archives 表获取 body 字段
$row = $dsql->GetOne("SELECT `body` FROM `dede_archives` WHERE `id` = $aid");
// 从 dede_addonarticle 表获取 body 字段 (更推荐,因为内容在附加表)
// $row = $dsql->GetOne("SELECT `body` FROM `dede_addonarticle` WHERE `aid` = $aid");
if (is_array($row)) {
// 返回经过处理的 HTML 内容
return $row['body'];
} else {
return '';
}
}
步骤 2:在模板中使用

(图片来源网络,侵删)
你就可以像上面的示例代码一样,在任何模板文件中使用这个函数了。
{dede:arclist idlist='1' titlelen='50'}
<h3>[field:title/]</h3>
<div class="content">
[field:id function="GetOneArchive(@me, 'content')"/]
</div>
{/dede:arclist}
不推荐的“曲线救国”方法(仅作了解)
有些老教程或特定场景下,可能会使用 arclist 的 textlink 或 innertext 等方式,通过获取文章页面的某个部分来“模拟”获取内容。这种方法非常不推荐,原因如下:
- 效率低下:需要额外请求一次文章页面,会增加服务器负担。
- 不稳定:如果文章页面的模板结构发生变化,调用就会失败。
- 安全性差:直接输出未经处理的 HTML 可能存在 XSS 风险。
示例(仅作了解,请勿在生产环境使用):
{dede:arclist idlist='1' channelid='1' addfields='body'}
[field:body/]
{/dede:arclist}
为什么这个代码通常无效?
arclist 默认不支持直接调用附加表(如 dede_addonarticle)中的 body 字段,虽然 addfields 参数理论上可以,但在 DedeCMS 的标准机制下,它通常只在 list 标签(列表页标签)中才被正确解析,在 arclist 中经常失效或无法正常输出内容。这通常不是一个可靠的解决方案。
在文章详情页获取内容
如果你已经在文章的详情页(如 article_article.htm),获取内容就非常简单了,直接使用 field 标签即可。
<h1>[field:title/]</h1>
<div class="article-content">
[field:body/]
</div>
[field:body/]: 直接输出文章的完整内容。[field:content/]: 在某些模板或版本中,content和body是等价的,也可以使用。
总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 方法一 (推荐) | 高效、稳定、标准 | 需要修改 extend.func.php 文件 |
列表页调用单篇文章完整内容,如“最新推荐”、“编辑推荐”等。 |
| 方法二 (不推荐) | 代码看起来简单 | 低效、不稳定、不可靠 | 不推荐在任何场景下使用。 |
| 方法三 (详情页) | 极其简单,无需额外操作 | 只能在文章详情页使用 | *页(article_.htm)**。 |
最终建议:
请务必使用 方法一,虽然它比直接写标签多了一步(创建函数),但这是 DedeCMS 二次开发中最规范、最可靠的方式,能确保你的网站长期稳定运行。
