使用 {dede:likearticle} 标签(最推荐、最简单)
这是DedeCMS内置的专门用于调用相关文章的标签,其原理就是根据当前文章的标签来查找其他包含相同标签的文章,使用起来非常方便。

(图片来源网络,侵删)
适用场景页(article_article.htm)中,显示与当前文章相关的文章列表。
实现步骤
-
打开文章模板文件 找到并打开你当前使用的文章内容页模板,通常是
/templets/default/article_article.htm。 -
添加
{dede:likearticle} 在你希望显示“相关文章”的位置,添加以下代码:<div class="related-article"> <h3>相关文章</h3> <ul> {dede:likearticle row='10' titlelen='42'} <li> <a href="[field:arcurl/]">[field:title/]</a> <span>([field:pubdate function="MyDate('Y-m-d', @me)"/])</span> </li> {/dede:likearticle} </ul> </div> -
标签参数说明
row='10':表示调用10篇相关文章,你可以根据需要修改这个数字。titlelen='42':表示文章标题的字符长度,超过这个长度的会自动截断并加上“...”,你也可以使用infolen来截断摘要。typeid='':可以指定调用某个栏目ID下的相关文章,留空则表示不限制栏目。orderby='':排序方式,默认是rand(随机),你也可以使用click(按点击量)、pubdate(按发布日期)等。
优点
- 代码最简单:无需额外修改任何PHP文件。
- 性能较好:这是系统内置的标签,经过了优化。
- 功能强大:能满足大部分相关文章的调用需求。
使用 {ded:tag} 自定义SQL标签(灵活、功能强大)
{dede:likearticle} 标签不能满足你的特殊需求(比如需要自定义排序、筛选条件等),你可以使用自定义SQL标签来实现。

(图片来源网络,侵删)
适用场景
- 需要更灵活地控制查询逻辑,比如按点击量排序、排除当前文章、调用特定数量的标签等。
实现步骤
-
在模板中添加自定义标签 在模板文件中,使用
{dede:sql}标签来执行自定义的SQL查询。<div class="related-article-by-tag"> <h3>按标签相关的文章</h3> <ul> {dede:sql sql=" SELECT a.id, a.title, a.arcurl, a.pubdate FROM `dede_archives` a LEFT JOIN `dede_taglist` b ON a.id = b.aid WHERE b.tag IN ( SELECT tag FROM `dede_taglist` WHERE aid = '~id~' ) AND a.id != ~id~ GROUP BY a.id ORDER BY a.click DESC LIMIT 10 "} <li> <a href="[field:arcurl/]">[field:title/]</a> <span>([field:pubdate function="MyDate('Y-m-d', @me)"/])</span> </li> {/dede:sql} </ul> </div> -
SQL语句解析
SELECT a.id, a.title, a.arcurl, a.pubdate:从文章表 (dede_archives) 中选择需要的字段。FROMdede_archivesa LEFT JOINdede_taglistb ON a.id = b.aid:关联文章表和标签表,通过文章ID (aid) 进行连接。WHERE b.tag IN (SELECT tag FROMdede_taglistWHERE aid = '~id~'):这是核心逻辑,它先找出当前文章(aid = '~id~')的所有标签,然后筛选出其他文章(a.id != ~id~)也包含这些标签的文章。GROUP BY a.id:对结果进行分组,确保每篇文章只显示一次。ORDER BY a.click DESC:按点击量降序排列,你也可以改成a.pubdate DESC按发布时间排序。LIMIT 10:限制只返回10条结果。
-
传递当前文章ID 上面的SQL中
~id~是一个占位符,DedeCMS会自动将其替换为当前文章的ID,你不需要手动处理,系统会自动完成。
优点
- 灵活性极高:可以完全自定义SQL查询,实现任何复杂的逻辑。
- 性能可控:可以通过添加索引和优化查询语句来提升性能。
缺点
- 代码稍复杂:需要懂一些基本的SQL语法。
- 有一定风险:错误的SQL可能导致网站出错,需要谨慎。
使用全局变量 $tags 和 GetTags() 函数(传统方法)
这是一种比较传统的实现方式,通过先获取当前文章的所有标签,然后循环调用每个标签的文章。

(图片来源网络,侵删)
适用场景
- 适用于旧版本的DedeCMS,或者需要为每个标签单独调用文章列表的场景。
实现步骤
-
获取当前文章的标签 需要在模板中通过PHP代码获取当前文章的标签列表,并将其存入一个数组。
<div class="related-article-traditional"> <h3>传统方法调用相关文章</h3> <ul> <?php $tags = ''; $tagsArr = array(); // 获取当前文章的标签 $dsql->SetQuery("SELECT tag FROM `dede_taglist` WHERE aid = @me"); $dsql->Execute('tag'); while($row = $dsql->GetArray('tag')) { $tags .= ($tags == '' ? $row['tag'] : ','.$row['tag']); $tagsArr[] = $row['tag']; } ?> {dede:arclist titlelen='42' row='10'} <li> <a href="[field:arcurl/]">[field:title/]</a> </li> {/dede:arclist} </ul> </div>注意:上面的方法只是一个示例框架,
{dede:arclist}本身不支持直接按标签数组查询,通常需要结合PHP循环和多次查询来实现,代码会非常臃肿,不推荐在现代开发中使用。更传统(但更过时)的做法是,在文章页通过
GetTags()函数获取标签字符串,然后在后台通过自定义函数处理,这种方式非常繁琐,性能也较差。
优点
- 理论上可以实现。
缺点
- 代码极其复杂且臃肿。
- 性能最差:需要进行多次数据库查询。
- 维护困难:可读性差,容易出错。
总结与推荐
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
{dede:likearticle} |
代码简单、性能好、官方推荐 | 灵活性相对较低 | ⭐⭐⭐⭐⭐ (首选) |
{dede:sql} |
灵活性强、功能强大 | 需要SQL知识,有出错风险 | ⭐⭐⭐⭐ (特殊需求时使用) |
| 传统方法 | 无明显优点 | 代码复杂、性能差、不维护 | ⭐ (不推荐) |
对于绝大多数情况,请直接使用方法一 {dede:likearticle},它是最简单、最稳定、最高效的解决方案,只有在需要 {dede:likearticle} 无法满足的特殊功能时,才考虑使用方法二。
