核心原理
织梦的标签系统允许你通过SQL查询来获取数据,要调用相关文章,核心思路是:

(图片来源网络,侵删)
- 获取当前文章的标签:你需要知道当前文章的
tag字段里存储了哪些标签。 - 根据标签查找其他文章:在数据库的
dede_archives(文章主表)和dede_taglist(标签文章关联表)中进行查询,找到包含相同标签的其他文章。 - 排除当前文章:在查询结果中排除掉当前正在浏览的这篇文章,以避免重复。
使用内置的 likearticle 标签(最简单)
织梦内置了一个 {dede:likearticle} 标签,它就是专门用来调用相关文章的,这是最简单、最直接的方法。
适用场景:只需要一个简单的相关文章列表,对自定义要求不高。
代码示例:
将以下代码放置在你需要显示相关文章的模板文件中(通常是 article_article.htm)。

(图片来源网络,侵删)
<h3>相关文章</h3>
<ul>
{dede:likearticle titlelen='42' row='8'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:likearticle}
</ul>
参数说明: len='42'`:相关文章标题的长度,限制为42个汉字(一个汉字算2个字节)。
row='8':显示的相关文章数量,这里是8篇。typeid='':可以指定只调用某个栏目下的相关文章,留空则表示全站。innertext='':循环体内的模板代码,如上面的<li>...</li>。
优点:
- 使用简单,无需编写SQL。
- 织梦官方提供,兼容性较好。
缺点:
- 自由度较低,无法进行更复杂的筛选或排序。
- 默认的匹配算法可能不够精确。
使用 arclist 标签 + 自定义SQL(推荐,更灵活)
这是最常用且最灵活的方法,它通过 arclist 标签的 sql 属性来执行自定义的SQL查询,从而精确控制相关文章的获取逻辑。
适用场景:需要对相关文章进行排序、按栏目筛选、排除特定栏目等高级操作。
代码示例:
<h3>相关文章</h3>
<ul>
{dede:arclist row='10' titlelen='40' orderby='rand'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
</ul>
等等,上面的代码不对! 这只是一个普通的随机文章列表,我们需要在 sql 属性中写正确的查询逻辑。
正确的SQL实现:
<h3>相关文章</h3>
<ul>
{dede:sql sql='
SELECT a.id, a.title, a.typeid, a.litpic, a.pubdate
FROM dede_archives a
JOIN dede_taglist t ON a.id = aid
WHERE t.tag IN (
SELECT tag FROM dede_taglist WHERE aid = ~id~
)
AND 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}
</ul>
SQL语句详解:
SELECT a.id, a.title, ...:从文章主表dede_archives(别名为a)中选择我们需要的字段。JOIN dede_taglist t ON a.id = aid:将文章表和标签关联表dede_taglist(别名为t)通过文章ID(aid)进行内连接。WHERE t.tag IN (SELECT tag FROM dede_taglist WHERE aid = ~id~):这是核心筛选条件,它查找tag字段与当前文章标签相同的所有记录。~id~是织梦模板中的特殊变量,会被自动替换为当前文章的ID。
AND a.id <> ~id~:非常重要,排除当前文章本身,避免显示自己。GROUP BY a.id:因为一个文章可能有多个标签,连接后可能会出现重复的文章,所以按文章ID分组去重。ORDER BY a.pubdate DESC:按发布时间降序排列,让最新的文章排在前面,你也可以使用rand()随机排序。LIMIT 0, 10:限制只返回10条结果。
优点:
- 非常灵活:可以自由编写SQL,实现任何复杂的查询逻辑。
- 性能可控:可以精确控制查询的字段和条件,避免不必要的查询。
- 功能强大:可以轻松实现按栏目、按时间、按随机等多种排序方式。
缺点:
- 需要了解基本的SQL语句。
- 如果网站文章和标签数据量巨大,此SQL可能会对数据库造成一定压力(通常影响不大)。
使用 loop 标签 + 自定义SQL(与方法二类似)
loop 标签比 arclist 更底层,它直接执行一个SQL并循环输出结果,当 arclist 无法满足需求时,可以使用 loop。
代码示例:
<h3>相关文章</h3>
<ul>
{dede:loop table='dede_archives a JOIN dede_taglist t ON a.id = aid'
sort='a.pubdate DESC'
row='10'
if='t.tag IN (SELECT tag FROM dede_taglist WHERE aid = ~id~) AND a.id <> ~id~'}
<li>
<!-- 注意:这里需要手动拼接URL -->
<a href='[field:global.cfg_phpurl/]/view.php?aid=[field:id/]'>[field:title/]</a>
</li>
{/dede:loop}
</ul>
参数说明:
table='...':直接指定要查询的表和连接条件。sort='...':排序方式。row='10':返回记录数。if='...':查询的WHERE条件。
与 arclist 的区别:
loop更加底层,直接操作表。arclist封装了更多织梦内部逻辑(如URL规则、栏目缓存等),通常更方便。- 在
loop中,URL可能需要手动拼接,而arclist会自动处理[field:arcurl/]。
建议:在大多数情况下,优先使用方法二(arclist + sql属性),因为它更简洁,且能更好地利用织梦的内置功能。
总结与建议
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
likearticle |
极其简单,开箱即用 | 不够灵活,自定义能力差 | ⭐⭐⭐ (适合新手或简单需求) |
arclist + SQL |
非常灵活,功能强大,性能可控 | 需要编写SQL语句 | ⭐⭐⭐⭐⭐ (强烈推荐,是专业开发者的首选) |
loop + SQL |
底层,直接控制SQL | 使用稍复杂,URL需手动处理 | ⭐⭐⭐ (当 arclist 无法满足时使用) |
最终建议:
对于绝大多数网站,使用方法二(arclist 结合自定义SQL)是最佳实践,它既保持了代码的简洁性,又提供了足够的灵活性和性能,能够完美满足各种复杂的相关文章调用需求。
注意事项:
- 表前缀:如果你的数据库表前缀不是默认的
dede_,请记得将SQL语句中的dede_替换成你自己的表前缀。 - 缓存:相关文章列表可以考虑加上缓存功能,以减少数据库查询次数,提升网站速度,可以在标签中加入
cache='3600'(缓存3600秒)等属性。
