核心思路
相关文章的逻辑通常是:获取当前文章的关键词,然后根据这些关键词去文章数据库里查找包含相同关键词的其他文章。

织梦内置的标签 {dede:likearticle} 就是专门为此设计的,它底层执行的SQL逻辑大致是:
SELECT * FROM dede_archives WHERE keywords LIKE '%关键词1%' OR keywords LIKE '%关键词2%' ... AND id <> 当前文章ID ORDER BY 点击量/发布时间 DESC
使用官方推荐标签 {dede:likearticle} (最简单)
这是最直接、最简单的方法,官方已经封装好了,只需要在模板文件中调用即可。
打开文章模板文件
登录织梦后台,进入 模板 -> 默认模板管理 -> 找到并点击 页模板 (article_article.htm) 进行编辑。
插入标签 在你希望显示相关文章的位置,插入以下代码:

<h3>相关文章</h3>
<ul class="related-article">
{dede:likearticle row='10' titlelen='50'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:likearticle}
</ul>
标签参数说明
row='10':显示的相关文章数量,默认是10条,你可以根据需要修改,len='50'`:相关文章标题的长度,如果标题太长,可以截断,单位是汉字/字符,50通常足够显示大部分标题。typeid='0':指定栏目ID,如果设置为某个栏目ID,则只显示该栏目下的相关文章,0表示不限制栏目。innertext='':自定义每条记录的HTML模板,你可以把上面的<li>...</li>写在innertext参数里,这样标签本身就不需要包含<li>了。{dede:likearticle row='10' titlelen='50' innertext='<li><a href="[field:arcurl/]">[field:title/]</a></li>'} {/dede:likearticle}这样写会更简洁,且逻辑更清晰。
使用 {dedarclist} 标签实现 (更灵活)
{dede:likearticle} 的默认逻辑(基于关键词)可能不够理想,或者你想加入更复杂的条件,这时,你可以使用功能更强大的 {dede:arclist} 标签,并结合PHP代码来实现。
打开文章模板文件
同样,编辑 article_article.htm。

插入代码
<h3>相关文章</h3>
<ul class="related-article">
{dede:arclist row='10' titlelen='50'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
</ul>
关键步骤:修改标签属性
{dede:arclist} 默认是根据栏目ID来调用的,所以必须手动修改它的属性,让它变成“相关文章”模式。
找到你刚刚插入的 {dede:arclist} 标签,为其添加以下属性:
{dede:arclist
row='10' len='50'
keyword='[field:keyword/]'
idlist=''
orderby='click'
}
keyword='[field:keyword/]':这是核心!它告诉arclist标签,使用当前文章的关键词(通过[field:keyword/]获取)作为搜索条件。arclist会自动将这些关键词拆开,并查找包含任一关键词的文章。idlist='':这个参数非常重要!因为当前文章本身也包含自己的关键词,如果不设置,当前文章也会被列出来,我们把它设为空字符串,就可以排除掉当前文章。orderby='click':按点击量排序,你也可以使用orderby='pubdate'按发布时间排序。
手动编写SQL查询 (最强大,适合高级用户)
如果你有非常特殊的需求,比如需要同时匹配关键词和某个特定字段,或者需要复杂的排序逻辑,那么可以直接在模板里嵌入PHP代码来执行自定义的SQL查询。
打开文章模板文件
编辑 article_article.htm。
插入PHP代码
<h3>相关文章</h3>
<ul class="related-article">
<?php
// 1. 获取当前文章的ID和关键词
$aid = $arcID; // $arcID 是当前文章ID的全局变量
$keywords = $this->Fields['keywords']; // $this->Fields 是当前文章数据的数组
// 2. 处理关键词,准备SQL查询
$keyword_array = explode(',', $keywords);
$like_keywords = '';
foreach ($keyword_array as $k) {
$like_keywords .= " OR keywords LIKE '%{$k}%'";
}
// 移除开头的 " OR "
$like_keywords = substr($like_keywords, 4);
// 3. 构建并执行SQL查询
$query = "SELECT id, title, arcurl FROM dede_archives WHERE id <> $aid AND ($like_keywords) ORDER BY click DESC LIMIT 10";
$dsql->SetQuery($query);
$dsql->Execute();
// 4. 循环输出结果
while ($row = $dsql->GetArray()) {
echo "<li><a href='{$row['arcurl']}'>{$row['title']}</a></li>";
}
?>
</ul>
代码解释:
$aid = $arcID;和$keywords = $this->Fields['keywords'];获取当前文章的核心信息。explode(',', $keywords)将关键词字符串(如“织梦,PHP,教程”)拆分成一个数组['织梦', 'PHP', '教程']。- 循环这个数组,构建一个
LIKE查询字符串,最终会变成keywords LIKE '%织梦%' OR keywords LIKE '%PHP%' OR keywords LIKE '%教程%'。 id <> $aid确保不显示当前文章本身。ORDER BY click DESC LIMIT 10按点击量排序,并只取前10条。- 最后使用
while循环从数据库结果集中读取数据,并直接用echo输出HTML。
总结与建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
{dede:likearticle} |
最简单,官方标签,无需额外代码。 | 灵活性较低,参数较少。 | 绝大多数场景,追求快速实现。 |
{dede:arclist} |
非常灵活,可以结合其他arclist的强大属性(如typeid, channel等)。 |
需要手动设置keyword和idlist属性,比likearticle稍显复杂。 |
需要在相关文章基础上增加更多筛选条件时。 |
| 手动SQL | 最强大,可以实现任何复杂的查询逻辑。 | 代码量多,需要懂PHP和SQL,有安全风险(注意防SQL注入,此例中因$aid是数字,较安全)。 |
有非常特殊、官方标签无法满足的需求时。 |
给新手的建议:
直接使用 方法一 ({dede:likearticle}) 就足够了,这是织梦官方为这个功能设计的最佳实践,稳定且易于维护。
如果你觉得默认的相关文章质量不高(比如因为关键词设置不合理),可以尝试 方法二 ({dede:arclist}),它提供了更多的排序和筛选选项,效果通常会比默认的更好。
