使用官方提供的 {dede:likearticle} 标签(最常用、最推荐)
这是织梦官方内置的标签,专门用于调用相关文章,它非常方便,功能也足够强大,能满足大部分需求。

基础用法
将以下代码放在文章内容页(article_article.htm)模板的任何你希望显示相关文章的位置即可。
{dede:likearticle}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:likearticle}
[field:arcurl/]:文章的链接地址。[field:title/]:文章的标题。
标签属性详解
{dede:likearticle} 标签支持多种属性,可以让你精确控制相关文章的显示方式。
row='10':显示的文章数量,默认为 10 篇。col='1':每行显示的列数,默认为 1(即单列),len='30'的长度,超过这个字数会被截断并添加...`。infolen='160':文章摘要的长度(如果调用摘要的话)。orderby='click':排序方式。click:按点击量排序(默认)。pubdate:按发布时间排序。rand:随机排序。
typeid='0':指定栏目 ID。0:不限制栏目(默认,会从全站查找)。数字:只显示指定栏目 ID 下的文章。数字1,数字2:显示多个指定栏目下的文章。
channelid='1':指定模型 ID。1代表文章模型,2代表图集模型等,默认为1。imgwidth='120':如果调用文章缩略图,设置图片宽度。imgheight='90':如果调用文章缩略图,设置图片高度。textlen='100':显示文章正文的长度,超出部分截断。
综合示例
假设我们要调用 8 篇相关文章,按发布时间排序,并且只显示当前文章所在栏目的文章,同时显示标题和缩略图。
<h3>相关文章</h3>
<ul class="related-article">
{dede:likearticle row='8' col='1' titlelen='30' orderby='pubdate' typeid=''}
<li>
<a href="[field:arcurl/]">
<img src="[field:picname/]" alt="[field:title/]" width="120" height="90" />
<span>[field:title/]</span>
</a>
</li>
{/dede:likearticle}
</ul>
注意:typeid='' 留空表示不限制栏目,如果你只想调用当前文章所在栏目的,可以删除这个属性或者留空,如果你想在所有栏目中查找,可以明确写上 typeid='0'。

使用 SQL 查询标签 {dede:sql}(高级、灵活)
当官方的 {dede:likearticle} 标签无法满足你的特殊需求时(需要根据非常复杂的条件进行关联),你可以使用更底层的 {dede:sql} 标签直接执行 SQL 查询。
工作原理
通过 SQL 语句,我们可以手动指定如何查找“相关”的文章,最常用的相关逻辑是:根据文章标签,即,找出与当前文章拥有相同标签的其他文章。
示例代码(基于标签关联)
将以下代码放在你的模板文件中:
{dede:sql sql="
SELECT a.id, a.title, a.arcurl, a.litpic
FROM dede_archives a
JOIN dede_taglist t ON a.id = aid
JOIN (
SELECT tagid FROM dede_taglist WHERE aid = ~id~
) AS my_tags ON t.tagid = my_tags.tagid
WHERE a.id != ~id~
GROUP BY a.id
ORDER BY a.pubdate DESC
LIMIT 0, 10
"}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:sql}
代码解释:

SELECT a.id, a.title, a.arcurl, a.litpic: 从dede_archives表(别名为a)中选择文章的基本信息。JOIN dede_taglist t ON a.id = aid: 关联dede_archives表和dede_taglist表(文章标签关联表),通过文章 ID (aid) 进行连接。JOIN (SELECT tagid FROM dede_taglist WHERE aid = ~id~) AS my_tags ...: 这是一个子查询,它会先找出当前文章 (~id~是织梦的变量,代表当前文章ID) 的所有tagid。WHERE a.id != ~id~: 排除当前文章本身,避免重复。GROUP BY a.id: 确保每个相关文章只显示一次。ORDER BY a.pubdate DESC LIMIT 0, 10: 按发布时间倒序排列,并只取前 10 条结果。
优点:
- 极其灵活,可以实现任何你想到的关联逻辑(如按关键词、按作者等)。
- 性能可能比官方标签更优,因为你可以精确控制查询的字段和条件。
缺点:
- 需要你懂一些 SQL 语句。
- 如果数据库表结构发生变化,代码可能会失效。
修改官方标签的底层逻辑(进阶)
如果你发现官方的 {dede:likearticle} 标签算法不理想(比如它默认是按关键字匹配,但匹配效果不好),你可以直接修改其核心 PHP 文件,让它使用你想要的算法,比如上面提到的“按标签匹配”。
操作步骤:
-
找到文件: 打开织梦的
/include/taglib/likearticle.lib.php文件,这个文件就是{dede:likearticle}标签的核心逻辑所在。 -
修改代码: 在这个文件中,找到关键的 SQL 查询部分,默认的查询可能类似于
... AND ( CONCAT(arc.keywords,',',arc.title) LIKE '%".$keyword."%' ) ...这样的模糊匹配。你可以将这部分逻辑替换为你自己写的 SQL,比如替换成上面方法二中提到的“按标签匹配”的 SQL 语句(需要做一些变量适配)。
-
保存并测试: 修改后,保存文件,清除一下织梦的缓存(后台 -> 系统 -> 清除缓存),然后刷新文章页面查看效果。
优点:
- 从根本上改变了官方标签的行为,一劳永逸。
- 保持了标签调用的简洁性。
缺点:
- 直接修改核心文件,升级织梦版本时可能会被覆盖,需要重新修改。
- 对 PHP 代码能力有一定要求。
总结与推荐
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
{dede:likearticle} |
简单、官方、稳定、属性丰富 | 算法固定,可能不够智能 | 99% 的场景,强烈推荐作为首选 |
{dede:sql} |
极度灵活、可定制任何逻辑 | 需要懂 SQL、代码稍复杂、维护性差 | 官方标签无法满足的特殊需求,如按作者、按自定义字段关联 |
| 修改核心文件 | 从根本上优化,调用方式不变 | 升级会覆盖、有风险、需要技术能力 | 对官方算法极度不满,且不介意手动维护代码的开发者 |
给你的建议:
- 首先尝试使用方法一,通过调整
row、orderby、typeid等属性,看看是否能满足你的需求。 - 如果效果不理想,再考虑使用方法二,用 SQL 实现按标签关联,这通常比官方默认的关键字匹配效果好得多。
- 只有当你有很强的定制需求,并且不害怕修改核心文件时,才去考虑方法三。
