这个功能非常实用,常用于制作“相关文章”模块,下面我将为您详细讲解实现方法,从简单到复杂,并提供最推荐的方案。

(图片来源网络,侵删)
核心思路
- 获取当前文章的关键词:我们需要知道当前正在浏览的文章有哪些关键词。
- 构建查询条件:将获取到的关键词组合成一个SQL查询的
WHERE子句,用于在数据库中查找匹配的文章。 - 执行查询并调用数据:使用织梦的标签(如
{dede:arclist})来执行查询,并循环输出结果。
使用织梦自带的相关文章标签(最简单)
织梦CMS内置了一个非常方便的标签 {dede:likearticle},专门用于调用与当前文章相关的文章,它的原理就是基于文章的关键词进行匹配。
标签代码:
{dede:likearticle row='10' titlelen='42'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:likearticle}
参数说明:
row='10':调用10条相关文章,len='42'`:标题最多显示42个字符(一个汉字算2个字符)。typeid='':可以指定特定栏目ID,留空则全站搜索。innertext='':循环体内的模板代码。
优点:

(图片来源网络,侵删)
- 极其简单:无需任何代码修改,直接复制粘贴即可使用。
- 效率较高:底层是经过优化的SQL查询。
- 官方支持:最稳定、最推荐的方式。
缺点:
- 灵活性较低:自定义能力不强,比如很难加入自定义字段、按时间排序等。
使用自定义SQL+{dede:arclist}标签(最灵活)
如果你需要更强大的自定义功能,比如修改排序方式、调用自定义字段等,可以手动编写SQL语句,并结合{dede:arclist}标签来实现。
实现步骤:
创建一个自定义宏标记(可选,但推荐)
为了避免在模板中写大段复杂的PHP代码,我们可以创建一个自定义宏标记来获取关键词。

(图片来源网络,侵删)
在织梦后台,进入 “模板” -> “宏标记管理” -> “增加一个新的宏标记”。
- 宏名称:
getkeywords - 类型:定义为“标记”
- :输入以下PHP代码
global $dsql;
$id = isset($refObj->Fields['id']) ? $refObj->Fields['id'] : 0;
if($id > 0){
$query = "SELECT keywords FROM dede_archives WHERE id = $id";
$row = $dsql->GetOne($query);
// 将关键词按逗号分割,并去除空格
$keywords = empty($row['keywords']) ? '' : str_replace(' ', '', $row['keywords']);
return $keywords;
}
注意:
dede_archives是织梦默认的文章主表表名,如果你的表前缀修改过,请相应更改。
在模板中编写调用代码
你可以在文章详情页模板(通常是 article_article.htm)中使用这个宏标记和{dede:arclist}了。
<h3>相关文章</h3>
<ul>
{dede:arclist
typeid=''
titlelen='42'
row='10'
orderby='pubdate'
keyword='[field:global name=autokeywords/]'
}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
</ul>
代码解析:
{dede:arclist}:这是织梦用来调用文章列表的核心标签。keyword='[field:global name=autokeywords/]':这是关键![field:global name=autokeywords/]是织梦在文章页模板中内置的一个全局变量,它自动获取当前文章的关键词。- 我们将这个变量值传递给
arclist标签的keyword属性。arclist标签在接收到这个参数后,会自动将其转换为SQL的AND (keywords LIKE '%关键词1%' OR keywords LIKE '%关键词2%')这样的查询条件。
orderby='pubdate':按发布时间倒序排列,你也可以改成click(按点击量)等。typeid='':留空表示在所有栏目中查找,如果只想在当前栏目查找,可以写typeid='[field:typeid/]'。
优点:
- 灵活性极高:可以自由组合
arclist的所有参数,实现各种复杂需求。 - 代码清晰:使用内置变量
autokeywords,比手动获取关键词更简洁。
缺点:
- 相比
likearticle标签,需要手动编写标签参数。
使用PHP代码直接查询(不推荐,仅作了解)
这种方法直接在模板文件里写PHP代码,虽然功能最强大,但破坏了模板的易用性,且存在安全风险,不推荐普通用户使用。
<h3>相关文章</h3>
<ul>
<?php
$keywords = '';
if (isset($this->Fields['keywords'])) {
$keywords = str_replace(' ', '', $this->Fields['keywords']);
}
if (!empty($keywords)) {
$query = "SELECT id, title FROM dede_archives
WHERE id!={$this->Fields['id']} AND (";
$keyword_arr = explode(',', $keywords);
foreach ($keyword_arr as $k) {
$query .= " keywords LIKE '%{$k}%' OR";
}
$query = rtrim($query, 'OR') . ") ORDER BY pubdate DESC LIMIT 10";
$dsql->SetQuery($query);
$dsql->Execute();
while ($row = $dsql->GetArray()) {
echo "<li><a href='/plus/view.php?aid={$row['id']}'>{$row['title']}</a></li>";
}
}
?>
</ul>
总结与推荐
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
{dede:likearticle} |
简单、高效、稳定 | 灵活性低 | ★★★★★ (首选) |
{dede:arclist}+autokeywords |
灵活、功能强大 | 需要了解arclist参数 |
★★★★☆ (次选,用于特殊需求) |
| PHP代码直接查询 | 功能无限定制 | 破坏模板、不易维护、有风险 | ★☆☆☆☆ (不推荐) |
给你的建议:
- 如果你只是想要一个“相关文章”模块:直接使用 方法一 (
{dede:likearticle}),这是最标准、最省事的做法。 - 如果你需要对相关文章进行特殊排序、调用自定义字段等:使用 方法二 (
{dede:arclist}+autokeywords),它能满足你90%以上的自定义需求。
希望这个详细的解释能帮助你解决问题!
