使用 {dede:list} 标签并附加 function 属性(最推荐)
这是最灵活、最规范的方法,它可以在列表循环中直接对每个文章的摘要进行处理。

(图片来源网络,侵删)
场景: 在列表页的列表项(li)中,显示文章摘要。
代码示例:
{dede:list pagesize='10' titlelen='50'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<!-- 在这里调用描述 -->
<p class="description">[field:description function='htmlspecialchars(@me)'/]</p>
</li>
{/dede:list}
代码解析:
{dede:list}: 这是DedeCMS的列表循环标签,pagesize='10'表示每页显示10条。[field:description ...]: 这是调用文章摘要的核心。function='htmlspecialchars(@me)': 这是关键部分。@me:代表当前字段的原始值,也就是[field:description]的内容。htmlspecialchars():这是一个PHP函数,用于将 HTML 特殊字符(如<,>,&, )转换为 HTML 实体,这样做可以防止摘要中包含的HTML标签(如<p>,<br>)破坏你的列表页布局,并防止XSS跨站脚本攻击。强烈建议使用此函数。- 你也可以使用其他函数,
cn_substr(@me, 100)来截取摘要的前100个字符。[field:description function='htmlspecialchars(cn_substr(@me, 100))'/]。
使用 {dede:arclist} 标签(适用于非标准列表页)
如果你的列表页不是用 {dede:list} 标签生成的(比如用了自定义的SQL查询),或者你想在列表页的其他地方(如侧边栏)调用一些热门文章的摘要,{dede:arclist} 是一个很好的选择。

(图片来源网络,侵删)
场景: 在列表页的侧边栏调用“热门文章”及其摘要。
代码示例:
{dede:arclist titlelen='50' row='5' typeid=''}
<a href="[field:arcurl/]">[field:title/]</a>
<p class="description">[field:description function='htmlspecialchars(cn_substr(@me, 80))'/]</p>
{/dede:arclist}
代码解析:
{dede:arclist}: 通用文章列表标签,功能强大。typeid='': 指定栏目ID,留空表示调用所有栏目。row='5': 表示调用5条记录。[field:description function='...'/]: 与方法一中的用法完全相同,可以灵活使用PHP函数来处理摘要内容。
使用SQL直接查询(高级用法)
当以上方法无法满足复杂需求时(需要根据特定条件筛选并调用摘要),可以直接使用SQL标签。

(图片来源网络,侵删)
场景: 调用指定栏目ID下,带有特定关键词的文章摘要。
代码示例:
{dede:sql sql='SELECT description, arcurl, title FROM `dede_archives` AS a LEFT JOIN `dede_arctype` AS t ON a.typeid = t.id WHERE t.id = 1 AND a.title LIKE "%关键词%" LIMIT 10'}
<a href="[field:arcurl/]">[field:title/]</a>
<p class="description">[field:description function='htmlspecialchars(@me)'/]</p>
{/dede:sql}
代码解析:
{dede:sql}: 执行自定义SQL语句的标签。SELECT ... FROM ... WHERE ...: 标准的SQL查询语句。dede_archives: 存储文章基本信息的表。dede_arctype: 存储栏目信息的表。WHERE t.id = 1: 只从栏目ID为1的栏目中查询。AND a.title LIKE "%关键词%": 并且文章标题包含“关键词”。LIMIT 10: 限制返回10条结果。
[field:description ...]: 在SQL标签中,[field:字段名/]用于输出查询结果中的对应列。
重要注意事项和常见问题
-
后台没有填写摘要怎么办? 如果文章在后台没有填写摘要,
[field:description]将会是空的,这会导致列表页出现空白段落,影响美观。 解决方案: 使用function函数进行判断和截取,如果摘要为空,就自动截取正文内容。{dede:list} <p class="description"> [field:description function=' if(trim(@me)==""){ $str = cn_substr(Html2Text(@me), 200); // 如果摘要为空,则截取正文的纯文本前200字符 }else{ $str = htmlspecialchars(@me); // 如果有摘要,则使用摘要 } echo $str; '/] </p> {/dede:list}Html2Text(): 这是一个DedeCMS内置函数,用于将HTML文本转换为纯文本,你需要确保它可用。cn_substr(): 用于截取字符串。- 这种写法比较复杂,但非常实用,你可以将其封装成一个自定义函数,然后在模板里调用,这样代码会更整洁。
-
如何控制摘要的显示长度? 如上面例子所示,使用
cn_substr()函数即可,截取100个字符:[field:description function='cn_substr(@me, 100)'/] -
摘要中的HTML标签问题 再次强调,如果用户在摘要中输入了
<p>、<strong>等HTML标签,直接输出可能会破坏你的CSS样式。强烈建议对所有输出的摘要内容使用htmlspecialchars()函数,将其转为纯文本显示,如果需要保留部分格式,可以使用更复杂的过滤逻辑。
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
{dede:list} + function |
标准列表页 | 最推荐,代码简洁,与列表循环完美结合 | 功能相对 arclist 稍弱 |
{dede:arclist} |
侧边栏、推荐列表等 | 灵活,功能强大,可指定栏目等 | 在主列表循环中使用不如 {dede:list} 直观 |
{dede:sql} |
复杂、特殊的数据需求 | 灵活性最高,可定制任何查询 | 代码复杂,需要懂SQL,有安全风险(需注意防注入) |
对于绝大多数情况,方法一 是你的首选,它既安全又规范,能满足99%的列表页调用描述的需求。
