这里提供几种常用的方法,从最推荐到最不推荐,并解释其优缺点。

使用 cn_substr 函数截取内容(最推荐)
这是最标准、最高效的方法,它直接在数据库层面进行操作,性能最好,也最符合织梦的设计思想。
原理:
通过修改织梦的标签,在调用 body)字段时,使用 cn_substr 函数进行截取。
步骤:
- 打开你的列表页模板文件,通常是
/templets/你的栏目目录/list_栏目ID.htm。 - 找到你想要显示文章内容的地方。
- 使用以下修改后的标签:
{dede:list pagesize='10'}
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
<!-- 推荐用法:截取body内容的前200个字符,并去掉HTML标签 -->
<p>[field:body function='cn_substr(Html2Text(@me), 200)'/]...</p>
<p>发布时间:[field:pubdate function="MyDate('Y-m-d', @me)"/]</p>
<hr>
{/dede:list}
标签详解:

[field:body/]:这是调用文章完整内容的标签。function='cn_substr(Html2Text(@me), 200)':这是核心部分,它对field:body的值(用@me表示)进行函数处理。@me:代表当前字段的原始值,即[field:body]的内容。Html2Text(@me):这是一个织梦内置函数,作用是把HTML代码(如<p>,<br>)转换成纯文本,这一步非常重要,可以防止截断的HTML标签导致页面样式错乱。cn_substr(..., 200):这是织梦的截取字符串函数,它会把Html2Text处理后的纯文本内容截取前200个字符,你可以根据需要修改200这个数字。
- 在截取的文本后面加上省略号,是很好的用户体验习惯。
优点:
- 性能最佳:直接在数据库查询时完成(虽然这里是在PHP里处理,但效率远高于方法三),对服务器压力小。
- 安全可靠:使用官方函数,兼容性好。
- 代码简洁:一行代码搞定。
使用自定义宏标记(灵活且高效)
如果你的网站多个列表页都需要显示内容摘要,并且摘要长度可能不同,使用自定义宏标记是最好的选择,它实现了“代码复用”和“参数化”。
步骤:
-
在后台创建宏标记
- 登录DedeCMS后台。
- 进入
核心->批量维护->宏标记管理。 - 点击
增加新宏标记。 - 宏名称:填写一个你喜欢的名字,
artbody。 - 宏类型:选择
标记调用。 - :输入与方法一中的函数调用相同的代码:
cn_substr(Html2Text(@me), 200)。 - 备注:可以写上“截取文章内容前200字作为摘要”。
- 点击
保存。
-
在列表页模板中使用 创建好宏标记后,在列表页模板中调用就非常方便了。
{dede:list pagesize='10'}
<h3><a href="[field:arcurl/]">[field:title/]</a></h3>
<!-- 使用自定义宏标记 -->
<p>[field:body function='artbody'/]...</p>
<p>发布时间:[field:pubdate function="MyDate('Y-m-d', @me)"/]</p>
<hr>
{/dede:list}
优点:
- 代码复用:只需定义一次,全站所有列表页都可以调用。
- 易于维护:如果需要修改摘要长度(比如从200改成300),只需在后台修改宏标记内容即可,无需改动所有模板文件。
- 性能同方法一:本质上是方法一的封装,性能一样好。
修改PHP源文件(不推荐,应作为最后手段)
这种方法直接修改织梦的核心文件,可以实现“无感”调用,即你仍然使用 [field:body/],但它在列表页会自动截取。但强烈不推荐,因为升级织梦版本时,你的修改会被覆盖。
原理:
修改 include/arc.listview.class.php 文件,在列表查询数据时,对 body 字段进行处理。
步骤:
-
备份文件!备份
include/arc.listview.class.php。 -
用代码编辑器打开该文件。
-
搜索
GetSqlList($this->TypeID);函数,找到下面这段代码(可能在Select查询语句附近):$this->dsql->SetQuery("Select id,typename,typedir,isdefault,isdefault,defaultname,namerule2,moresite,siteurl,sitepath From `dede_arctype` where id='$typeid' "); -
找到生成文章列表的
Select语句,它通常长这样(在第100多行):$this->dsql->SetQuery("Select id,arcrank,click,title,shorttitle,color,writer, source,litpic,pubdate,senddate,arcrank,goodpost,badpost,memberid, ismake,channel,description,keywords,mtype,tid From `dede_archives` where $this->addSql And `arcrank` > -1 order by id desc"); -
修改
Select语句,在title后面添加body字段,并用SUBSTRING函数进行截取。注意不同数据库的语法:-
MySQL 数据库:
// 将原来的 title 后面加上 ,body $this->dsql->SetQuery("Select id,arcrank,click,title,body,shorttitle,color,writer, source,litpic,pubdate,senddate,arcrank,goodpost,badpost,memberid, ismake,channel,description,keywords,mtype,tid From `dede_archives` where $this->addSql And `arcrank` > -1 order by id desc");这样会获取完整的
body,然后我们再在PHP里处理。 -
更彻底的修改(不推荐):直接在SQL里截取(MySQL):
// 在 Select 语句中直接处理 $this->dsql->SetQuery("Select id,arcrank,click,title,shorttitle,color,writer, source,litpic,pubdate,senddate,arcrank,goodpost,badpost,memberid, ismake,channel,description,keywords,mtype,tid, LEFT(body, 200) as body -- 注意:这里只是简单截取,可能包含HTML标签 From `dede_archives` where $this->addSql And `arcrank` > -1 order by id desc");这种方法非常不推荐,因为它没有处理HTML标签,容易导致页面错乱。
-
-
更推荐的PHP处理方式:在第5步中,我们只把
body字段加入查询,然后在文件中找到处理数据的循环(通常在while($row = $this->dsql->GetArray())循环里),对$row['body']进行处理。 找到类似这样的代码:while($row = $this->dsql->GetArray()){ $row['title'] = $row['title']; // ... 其他处理 // ... 把$row数组赋值给一个总的数组 }在循环内部,对
$row['body']进行处理:while($row = $this->dsql->GetArray()){ // ... 其他字段处理 // 在这里对body进行处理 $row['body'] = cn_substr(Html2Text($row['body']), 200); // ... 把$row数组赋值给一个总的数组 }
优点:
- 模板标签最干净,直接使用
[field:body/]。
缺点:
- 破坏性修改:修改了核心文件,织梦升级后会被覆盖,需要重新修改。
- 维护困难:不熟悉代码的开发者很难找到和修复问题。
- 风险高:错误修改可能导致整个列表页无法显示。
总结与建议
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
cn_substr函数 |
性能好,代码简洁,安全可靠 | 每个模板里都要写一遍函数 | ⭐⭐⭐⭐⭐ |
| 自定义宏标记 | 最佳实践,代码复用,易于维护,性能好 | 需要后台设置一次 | ⭐⭐⭐⭐⭐ |
| 修改PHP源文件 | 模板标签最简洁 | 破坏性修改,升级会丢失,维护困难,风险高 | ⭐☆☆☆☆ |
最终建议:
- 如果只是在一个或少数几个列表页使用,直接选择 方法一。
- 如果这个需求会在多个地方使用,或者你希望以后能方便地调整摘要长度,请务必使用 方法二(自定义宏标记),这是最专业、最规范的做法。
