原因在于性能和效率:列表页通常会展示很多篇文章,如果每篇文章都把完整的正文内容都查询出来,会极大地增加数据库负担,导致页面加载缓慢。

(图片来源网络,侵删)
我们需要使用一些技巧来实现这个功能,下面我将为您介绍几种最常用和最有效的方法,从推荐到备选排序。
使用 description 或 keywords 字段(最推荐)
这是最简单、最规范、性能最好的方法,我们利用文章摘要(description)或关键词(keywords)字段来存储一小段内容。
操作步骤:
-
修改文章发布/编辑模板
(图片来源网络,侵删)- 登录织梦后台,进入【模板】->【默认模板管理】。
- 找到并编辑文章内容页的模板文件,通常是
article_article.htm。 - 在这个模板里,找到调用文章正文
{dede:field.body/}的地方。 - 在它前面或后面,添加一个隐藏的文本区域,用于将文章内容的一部分同步到
description字段。
<!-- 在 article_article.htm 模板中添加这段代码 --> <script type="text/javascript"> // 获取文章正文内容 var content = document.getElementById('article-content').innerText; // 截取前200个字符作为摘要 var summary = content.substring(0, 200); // 将摘要设置到 description 字段 document.getElementById('description').value = summary; </script> <!-- 原有的正文内容保持不变 --> <div id="article-content"> {dede:field.body/} </div> <!-- 添加一个隐藏的 input,用于在表单提交时传递新的摘要值 --> <input type="hidden" name="description" id="description" value="{dede:field.description function='html2text(@me)'/}">- 注意:上面的代码只是一个示例,更健壮的做法是修改后台的
article_add.php和article_edit.php文件,在保存文章时,用PHP代码自动截取body字段的内容来填充description字段,这需要一定的PHP开发知识。
-
在列表页模板中调用
- 进入【模板】->【默认模板管理】,编辑你的列表页模板文件,通常是
list_article.htm。 - 在你希望显示内容的位置,使用下面的标签来调用
description字段。
<ul> {dede:list pagesize='10'} <li> <a href="[field:arcurl/]">[field:title/]</a> <!-- 调用文章摘要,也就是我们同步过来的内容 --> <p>[field:description function='cn_substr(@me, 100)'/]...</p> </li> {/dede:list} </ul> - 进入【模板】->【默认模板管理】,编辑你的列表页模板文件,通常是
优点:
- 性能最佳:没有额外的数据库查询。
- 非常规范:
description字段本就用于描述文章内容。 - SEO友好:列表页展示的内容摘要有助于搜索引擎理解页面。
使用自定义字段(最灵活)
description 字段已经被其他用途占用,或者你需要调用更长/更特定的内容,可以使用自定义字段。
操作步骤:
-
添加自定义字段
- 在后台【核心】->【内容模型管理】中,点击你使用的模型(文章”模型)进行管理。
- 进入字段管理,点击“添加新字段”。
- 字段名:
listcontent(建议用英文,不能和系统保留字段冲突) - 字段类型:
文本区域(TEXTAREA) - 其他信息按需填写,然后保存。
-
在后台手动填写或自动填充
- 手动:每次发布文章时,在“自定义字段”区域找到
listcontent字段,手动填写你希望在列表页显示的内容。 - 自动(推荐):同样,可以通过修改
article_add.php等文件,在保存文章时自动将body字段的内容截取后存入listcontent字段。
- 手动:每次发布文章时,在“自定义字段”区域找到
-
在列表页模板中调用
- 编辑
list_article.htm模板。 - 使用
{dede:field.listcontent/}来调用你刚刚创建的自定义字段。
<ul> {dede:list pagesize='10'} <li> <a href="[field:arcurl/]">[field:title/]</a> <!-- 调用自定义字段的内容 --> <p>[field:listcontent function='cn_substr(@me, 150)'/]...</p> </li> {/dede:list} </ul> - 编辑
优点:
- 非常灵活:可以创建多个不同用途的自定义字段。
- 不影响系统原有字段。
使用SQL直接查询(不推荐,性能差)
这种方法可以直接在列表页标签里写SQL语句来获取内容,但强烈不推荐在列表页使用,尤其是在文章数量多的时候。
操作步骤:
-
在列表页模板中使用
arclist标签的sql属性- 编辑
list_article.htm模板。 - 使用
{dede:arclist}标签,并指定sql属性来直接查询dede_addonarticle表(默认文章附加表)的body字段。
<ul> {dede:arclist sql='SELECT id,title,body FROM dede_addonarticle ORDER BY id DESC' row='10'} <li> <a href="[field:arcurl/]">[field:title/]</a> <!-- 直接调用 body 字段,并截取 --> <p>[field:body function='htmlspecialchars(cn_substr(@me, 100))'/]...</p> </li> {/dede:arclist} </ul> - 编辑
缺点:
- 性能极差:
arclist本身就执行了一次查询,再嵌套一个复杂的sql查询,会为列表页的每一篇文章都执行一次数据库查询,当列表有10篇文章时,就会执行11次查询(1次获取列表+10次获取内容),服务器压力巨大。 - 不灵活:如果修改了文章模型(比如附加表名),代码就会失效。
- 标签功能受限:很多
arclist的内置属性在这种用法下可能无法正常工作。
总结与建议
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| 方法一 (description) | 性能最好、最规范、SEO友好 | 需要修改后台或模板以同步内容 | ⭐⭐⭐⭐⭐ (强烈推荐) |
| 方法二 (自定义字段) | 非常灵活、不影响系统字段 | 同样需要后台同步内容,增加一个字段 | ⭐⭐⭐⭐ (次推荐) |
| 方法三 (直接SQL) | 实现直接,无需修改后台 | 性能极差、不灵活、维护困难 | ⭐ (不推荐,仅限极特殊场景) |
最终建议:
对于绝大多数情况,请优先选择方法一(使用 description 字段),这是最符合织梦设计理念且最稳定高效的方式,如果你愿意花一点时间修改后台PHP文件实现自动同步,那么体验会完美,如果不想动PHP代码,手动在发布文章时复制一小段内容到摘要字段也是可行的。
