这是一个非常常见的需求,但很多新手会遇到只显示摘要、不显示内容的问题,核心原因在于 安全机制 和 性能考虑。

- 直接调用全文?不行。 出于安全(防止SQL注入)和性能(避免查询大字段)的考虑,
{dede:arclist}标签默认不支持直接调用文章的完整body- 最佳实践:使用摘要。 推荐使用文章的摘要字段(
description),这是最高效、最标准的做法。- 必须调用部分内容?有办法。 如果确实需要调用文章正文的一部分,可以通过自定义函数或修改系统文件来实现,但有一定风险。
- 最佳实践:使用摘要。 推荐使用文章的摘要字段(
调用文章摘要(最推荐、最安全、最标准)
这是 DedeCMS 设计之初就考虑好的方案,你在后台发布文章时,在“或“简介”字段中填写内容,然后在模板中调用。
后台设置摘要
在发布或编辑文章时,确保填写了“信息。
模板标签调用
在 {dede:arclist} 标签内,使用 [field:description/] 来调用摘要。
基本示例:

{dede:arclist typeid='1' titlelen='50' row='5'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<p>[field:description/]...</p>
</li>
{/dede:arclist}
标签说明:**
| 说明 | |
|---|---|
[field:description/] |
调用文章的摘要内容。 |
[field:info/] |
调用文章摘要,但会自动过滤掉 HTML 标签,只显示纯文本。 |
[field:infos/] |
与 info 类似,但长度更短,适合极简的简介。 |
优化显示(去除多余的HTML标签和空格):
中可能包含 <p>、<br> 等标签,或者开头有空格,我们可以使用 striphtml 和 cnsub 函数来优化显示。
{dede:arclist typeid='1' titlelen='50' row='5'}
<li>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
<p>
<!--
striphtml='true' 去除所有HTML标签
function='cn_substr(@me, 150)' 截取前150个字符
-->
[field:description function='(strip_tags(@me))' ]
...
</p>
</li>
{/dede:arclist}
调用文章正文的一部分(不推荐,但有解决方案)
如果你忘记写摘要,或者希望动态截取正文内容,可以尝试以下方法。注意:这些方法可能会影响网站性能,请谨慎使用。
方案A:使用自定义函数(推荐,无需修改核心文件)
这是最灵活且最安全的方法,因为它不修改 DedeCMS 的核心文件。

步骤 1:创建自定义函数文件
在 /include/extend.func.php 文件中(如果不存在,请自行创建),添加以下 PHP 函数:
/**
* 截取HTML内容,并保留一定长度
* @param string $str 原始HTML内容
* @param int $start 开始截取的位置
* @param int $length 截取长度
* @param string $charset 编码
* @param bool $ellipsis 是否在截取后添加省略号
* @return string
*/
function HtmlSub($str, $start = 0, $length = 100, $charset = "utf-8", $ellipsis = '...')
{
// 1. 过滤掉所有HTML标签和脚本样式
$str = preg_replace("/<script.*?>.*?<\/script>/si", "", $str);
$str = preg_replace("/<style.*?>.*?<\/style>/si", "", $str);
$str = strip_tags($str);
// 2. 截取纯文本
$str = mb_substr($str, $start, $length, $charset);
// 3. 添加省略号
if (mb_strlen($str, $charset) < mb_strlen(strip_tags($str), $charset)) {
$str .= $ellipsis;
}
return $str;
}
步骤 2:在模板中调用该函数
现在你可以在 {dede:arclist} 中使用这个自定义函数了。
{dede:arclist typeid='1' row='5'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<p>
<!--
调用自定义函数 HtmlSub
@me 表示当前字段的值,这里是[field:body/]
0 表示从第0个字符开始
200 表示截取200个字符
-->
[field:body function='HtmlSub(@me, 0, 200)'/]
...
</p>
</li>
{/dede:arclist}
优点:
- 安全,不修改核心文件。
- 功能强大,可以过滤掉脚本和样式,只保留纯文本。
缺点:
- 需要手动修改或创建文件。
- 每次调用都会执行 PHP 代码,对服务器有一定压力(如果列表文章很多)。
方案B:修改 DedeCMS 核心文件(不推荐,有风险)
警告:此方法会修改 DedeCMS 的核心文件,在升级系统时可能会被覆盖,导致功能失效,请谨慎操作!
步骤 1:找到并修改文件
找到并打开 /include/taglib/arclist.lib.php 文件。
步骤 2:修改代码
- 在文件中找到
$row['description'] = $this->TrimCN($row['description']);这一行(大约在 280 行左右)。 - 在它后面,添加以下代码,以获取
body字段的内容:
// 在 $row['description'] = ...; 这行后面添加 $row['body'] = $row['body'];
步骤 3:在模板中调用
你就可以在模板中通过 [field:body/] 来获取文章的完整正文内容了,然后结合 function 来截取。
{dede:arclist typeid='1' row='5'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<p>
<!--
直接调用body,并用mb_substr函数截取
注意:这里没有过滤HTML标签,如果正文有图片等,也会显示出来
-->
[field:body function='mb_substr(@me, 0, 200, "utf-8")'/]...
</p>
</li>
{/dede:arclist}
缺点:
- 风险高:修改核心文件,升级后可能丢失。
- 性能差:
body是一个长文本字段,在列表页中大量查询会严重影响数据库性能和页面加载速度。 - 显示混乱:直接截取
body可能会破坏 HTML 结构,导致显示错乱。
总结与建议
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| 调用摘要 | 性能最佳、安全、标准、官方推荐 | 需要手动在后台填写摘要 | ★★★★★ (强烈推荐) |
| 自定义函数 | 灵活、安全(不修改核心)、功能可控 | 需要修改PHP文件,对性能有轻微影响 | ★★★★☆ (当摘要无法满足需求时使用) |
| 修改核心文件 | 实现简单 | 风险高、性能差、可能破坏HTML | ☆☆☆☆☆ (强烈不推荐,仅限紧急情况或测试环境) |
给你的最终建议:
养成在后台发布文章时填写摘要的好习惯,这是最专业、最高效的网站建设方式,如果因为某些特殊原因确实需要动态截取内容,请优先选择自定义函数的方法。
