- 性能问题:
{dede:arclist}是一个用于列表页的标签,它旨在快速获取文章的核心信息(标题、日期、摘要等),如果用它来获取完整的正文内容,需要对列表中的每一篇文章都去执行一次查询以获取body字段,这会极大地增加数据库的查询压力,导致页面加载速度非常慢,甚至可能导致服务器宕机。 - 内容冗余:列表页通常只显示文章摘要,而不是全文,显示全文会破坏页面布局,让用户失去点击进入详情页阅读的欲望。
正确的方法是获取摘要,而不是正文,但如果你的确有特殊需求,必须显示正文,这里会提供几种方法,并强烈推荐第一种(性能最优)。

(图片来源网络,侵删)
最佳实践 - 使用 description 字段(获取摘要)
这是最推荐、最标准、性能最好的方法,在后台发布文章时,手动填写文章摘要,或者在文章内容中使用< dede:field name='description'/> 标签自动截取摘要。
在后台设置摘要 登录DedeCMS后台,在发布或编辑文章时,找到“或“内容简介”字段,手动填写一段文章的简介。
在模板中使用
在 {dede:arclist} 标签中,使用 description 字段来调用你设置的摘要。
{dede:arclist typeid='1' titlelen='30' row='10'}
<li>
<h3><a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a></h3>
<p class="summary">[field:description function='cn_substr(@me, 100)'/]</p> <!-- 使用函数截取100个字符 -->
<span class="date">[field:pubdate function='MyDate('Y-m-d', @me)'/]</span>
</li>
{/dede:arclist}
代码解释:

(图片来源网络,侵删)
[field:description/]:直接调用文章摘要。function='cn_substr(@me, 100)':这是一个非常实用的技巧。@me代表当前字段的值(即摘要内容),cn_substr是DedeCMS的截取字符串函数,这里的意思是“将摘要内容截取前100个字符”,可以防止摘要过长,破坏页面布局。
如果未设置摘要,自动截取正文(不推荐,有性能隐患)
如果你的文章没有填写摘要,但又想在列表页显示正文的前几行作为摘要,可以使用 body 字段,并用函数进行截取。
警告: 此方法会显著降低列表页的加载速度,请谨慎使用,尤其是在文章数量较多时。
{dede:arclist typeid='1' titlelen='30' row='10'}
<li>
<h3><a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a></h3>
<p class="summary">[field:body function='cn_substr(Html2Text(@me), 100)'/]</p>
<span class="date">[field:pubdate function='MyDate('Y-m-d', @me)'/]</span>
</li>
{/dede:arclist}
代码解释:
[field:body/]:直接调用文章的body字段(即正文内容)。function='cn_substr(Html2Text(@me), 100)':这里用到了两个关键函数,组合使用非常重要。Html2Text(@me):@me是原始的HTML正文内容。Html2Text函数会去除所有的HTML标签(如<p>,<a>,<img>等),只保留纯文本,这样可以防止HTML标签被截断导致页面错乱。cn_substr(..., 100):在去除HTML标签后的纯文本基础上,再截取前100个字符。
使用自定义函数(更灵活,但需要修改文件)
如果你有更复杂的需求,比如想从正文中提取特定部分,或者需要更精细的摘要控制,可以创建一个自定义函数。

(图片来源网络,侵删)
在 /include/extend.func.php 文件中添加自定义函数
打开这个文件,在末尾添加如下PHP代码:
// 自定义函数:从正文中提取摘要
function GetSummaryFromBody($body, $length = 200)
{
// 1. 去除HTML标签
$content = strip_tags($body);
// 2. 去除多余的空白和换行
$content = preg_replace('/\s+/', ' ', $content);
// 3. 截取指定长度的字符串
$summary = cn_substr($content, $length);
return $summary;
}
在模板中调用自定义函数
在 {dede:arclist} 中使用这个新函数。
{dede:arclist typeid='1' titlelen='30' row='10'}
<li>
<h3><a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a></h3>
<p class="summary">[field:body function='GetSummaryFromBody(@me, 150)'/]</p> <!-- 调用自定义函数,截取150字符 -->
<span class="date">[field:pubdate function='MyDate('Y-m-d', @me)'/]</span>
</li>
{/dede:arclist}
总结与建议
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
description 字段 |
性能最佳、标准、高效 | 需要手动在后台填写摘要 | 99% 的情况,所有列表页都应该使用此方法。 |
body + Html2Text |
无需手动填写摘要,自动生成 | 性能差,对数据库压力大 | 仅适用于少量文章、临时测试或特殊需求,生产环境应避免。 |
| 自定义函数 | 灵活性最高,可定制逻辑 | 需要修改PHP文件,有一定门槛 | 当摘要生成逻辑非常复杂,内置函数无法满足时使用。 |
最终建议:
始终优先使用方法一,养成良好的内容管理习惯,在发布文章时填写摘要,这是构建高性能、可维护网站的基础,只有在万不得已,且文章数量极少的情况下,才考虑使用方法二。
