页(article_article.htm)中,提取当前文章的关键词,然后根据这些关键词去数据库中查找包含相同关键词的其他文章,并将它们列表展示出来。

(图片来源网络,侵删)
实现这个功能主要有两种方法:
- 使用织梦内置的标签(最简单,但灵活性稍差)。
- 使用自定义SQL标签(最灵活,功能最强大,推荐)。
下面我将分步介绍这两种方法。
使用织梦内置的 {dede:likearticle}
织梦自带了一个非常方便的标签 likearticle,专门用于实现相关文章推荐,它就是基于关键词来匹配的。
标签基本用法
在你需要显示相关文章的模板文件中(通常是 article_article.htm),在文章内容下方或其他合适的位置,加入以下代码:
(图片来源网络,侵删)
<h3>相关文章推荐</h3>
<ul class="related-article-list">
{dede:likearticle row='10' titlelen='42'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:likearticle}
</ul>
标签参数说明
row='10':显示的相关文章数量,你可以根据需要修改,len='42'`:相关文章标题的长度,单位是汉字(一个汉字算2个字符),防止标题过长影响排版。
innertext='':如果你想在每条相关文章外面包裹特定的HTML标签,可以在这里设置。innertext='<li><a href="[field:arcurl/]">[field:title/]</a></li>',那么上面的 <li> 标签就可以省略。
typeid='':可以指定只显示某个栏目下的相关文章,留空则表示全站。
orderby='':排序方式,可选值有 rand (随机), click (按点击量), pubdate (按发布日期),默认是 rand。
优点和缺点
- 优点:
- 使用极其简单,一行标签搞定。
- 无需修改任何核心文件,升级织梦时不会被覆盖。
- 缺点:
- 功能有限:它只能基于文章的
keywords 字段进行匹配,无法进行更复杂的查询(比如排除当前文章、按权重排序等)。
- 灵活性差:自定义查询的能力较弱。
使用自定义SQL标签(强烈推荐)
这种方法功能更强大,可以实现更精细的控制,比如排除当前文章、按权重排序等,这是目前主流和推荐的做法。
第1步:修改文章内容页模板 (article_article.htm)
打开你的文章内容页模板文件,在 {dede:field.body/} 下面或其他你希望显示相关文章的位置,添加以下代码:
<h3>相关文章</h3>
<ul class="related-articles">
{dede:sql sql="SELECT id,title,arcurl FROM dede_archives WHERE keywords regexp REPLACE('~field:keywords~',' ',',') AND id != ~id~ ORDER BY weight DESC, click DESC LIMIT 0,10"}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:sql}
</ul>
第2步:代码详解
我们来分解一下这段SQL代码,让你明白每一部分的作用:
{dede:sql sql="..."} 这是织梦的自定义SQL查询标签。
(图片来源网络,侵删)
-
SELECT id,title,arcurl FROM dede_archives
id, title, arcurl:我们只需要文章的ID、标题和链接。
FROM dede_archives:从文章主表 dede_archives 中查询。注意:如果你的数据表前缀不是 dede_,请务必修改成你自己的表前缀!
-
WHERE keywords regexp REPLACE('~field:keywords~',' ',',')
keywords:查询条件,匹配 keywords 字段。
regexp:正则表达式匹配,比 LIKE 更强大,可以匹配多个关键词。
REPLACE('~field:keywords~',' ',','):这是最核心的部分。
~field:keywords~:这是织梦模板的变量占位符,在页面解析时,会被替换成当前文章的 keywords 字段内容,如果当前文章的关键词是 "织梦,CMS,教程",那么这里就会被替换成 "织梦,CMS,教程"。
REPLACE(..., ' ', ','):将关键词中的空格替换成逗号,因为 regexp 在匹配多个关键词时,通常用 (或) 或者 (逗号) 分隔,如果你的关键词是用空格分隔的,这一步就很有必要,如果你的关键词本身就是用逗号分隔的,可以简化为 regexp '~field:keywords~'。
- 整句话的意思是:查找
keywords 字段中包含当前文章任何一个关键词的文章。
-
AND id != ~id~
~id~:这是当前文章ID的占位符。
- 这句非常重要,它排除了当前文章本身,确保推荐的文章是“其他”文章。
-
ORDER BY weight DESC, click DESC
weight DESC:按文章的权重(weight 字段)从高到低排序,权重高的文章会优先显示。
, click DESC:如果权重相同,则按点击量(click 字段)从高到低排序。
- 你可以根据需要修改排序规则,
pubdate DESC (按发布时间)。
-
LIMIT 0,10
- 从第0条记录开始,取10条,也就是只显示10篇相关文章,你可以修改
10 来调整显示数量。
第3步:优化和注意事项
- 性能考虑:如果网站文章非常多,
regexp 操作可能会对数据库造成一定压力,但对于大多数中小型网站来说,影响微乎其微。
- 关键词格式:确保你的文章关键词格式统一(比如都用逗号分隔),这样SQL查询会更稳定。
- 表前缀:再次强调,请务必将
dede_archives 修改为你自己网站的数据表前缀。
- 美观样式:上述代码只提供了HTML结构,你可以通过CSS来美化
.related-articles 的样式,使其与你的网站风格保持一致。
总结与对比
特性
方法一 ({dede:likearticle})
方法二 ({dede:sql})
实现难度
非常简单,零代码基础可用
需要理解基本SQL和模板标签
功能灵活性
较低,功能固定
极高,可自定义查询条件、排序、排除项等
性能
织梦内部优化,性能尚可
取决于SQL语句复杂度和数据量,通常良好
推荐度
适合新手或快速实现
强烈推荐给所有用户,尤其是对功能有要求的
最终建议:
如果你只是想要一个简单的相关文章列表,用方法一足够了。
如果你希望获得更好的用户体验,比如排除当前文章、优先推荐权重高的文章,或者想学习更高级的织梦技巧,请毫不犹豫地选择方法二,它虽然多写几行代码,但带来的功能提升和掌控感是完全值得的。
织梦自带了一个非常方便的标签 likearticle,专门用于实现相关文章推荐,它就是基于关键词来匹配的。
标签基本用法
在你需要显示相关文章的模板文件中(通常是 article_article.htm),在文章内容下方或其他合适的位置,加入以下代码:

(图片来源网络,侵删)
<h3>相关文章推荐</h3>
<ul class="related-article-list">
{dede:likearticle row='10' titlelen='42'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:likearticle}
</ul>
标签参数说明
row='10':显示的相关文章数量,你可以根据需要修改,len='42'`:相关文章标题的长度,单位是汉字(一个汉字算2个字符),防止标题过长影响排版。innertext='':如果你想在每条相关文章外面包裹特定的HTML标签,可以在这里设置。innertext='<li><a href="[field:arcurl/]">[field:title/]</a></li>',那么上面的<li>标签就可以省略。typeid='':可以指定只显示某个栏目下的相关文章,留空则表示全站。orderby='':排序方式,可选值有rand(随机),click(按点击量),pubdate(按发布日期),默认是rand。
优点和缺点
- 优点:
- 使用极其简单,一行标签搞定。
- 无需修改任何核心文件,升级织梦时不会被覆盖。
- 缺点:
- 功能有限:它只能基于文章的
keywords字段进行匹配,无法进行更复杂的查询(比如排除当前文章、按权重排序等)。 - 灵活性差:自定义查询的能力较弱。
- 功能有限:它只能基于文章的
使用自定义SQL标签(强烈推荐)
这种方法功能更强大,可以实现更精细的控制,比如排除当前文章、按权重排序等,这是目前主流和推荐的做法。
第1步:修改文章内容页模板 (article_article.htm)
打开你的文章内容页模板文件,在 {dede:field.body/} 下面或其他你希望显示相关文章的位置,添加以下代码:
<h3>相关文章</h3>
<ul class="related-articles">
{dede:sql sql="SELECT id,title,arcurl FROM dede_archives WHERE keywords regexp REPLACE('~field:keywords~',' ',',') AND id != ~id~ ORDER BY weight DESC, click DESC LIMIT 0,10"}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:sql}
</ul>
第2步:代码详解
我们来分解一下这段SQL代码,让你明白每一部分的作用:
{dede:sql sql="..."} 这是织梦的自定义SQL查询标签。

(图片来源网络,侵删)
-
SELECT id,title,arcurl FROM dede_archivesid, title, arcurl:我们只需要文章的ID、标题和链接。FROM dede_archives:从文章主表dede_archives中查询。注意:如果你的数据表前缀不是dede_,请务必修改成你自己的表前缀!
-
WHERE keywords regexp REPLACE('~field:keywords~',' ',',')keywords:查询条件,匹配keywords字段。regexp:正则表达式匹配,比LIKE更强大,可以匹配多个关键词。REPLACE('~field:keywords~',' ',','):这是最核心的部分。~field:keywords~:这是织梦模板的变量占位符,在页面解析时,会被替换成当前文章的keywords字段内容,如果当前文章的关键词是 "织梦,CMS,教程",那么这里就会被替换成 "织梦,CMS,教程"。REPLACE(..., ' ', ','):将关键词中的空格替换成逗号,因为regexp在匹配多个关键词时,通常用 (或) 或者 (逗号) 分隔,如果你的关键词是用空格分隔的,这一步就很有必要,如果你的关键词本身就是用逗号分隔的,可以简化为regexp '~field:keywords~'。
- 整句话的意思是:查找
keywords字段中包含当前文章任何一个关键词的文章。
-
AND id != ~id~~id~:这是当前文章ID的占位符。- 这句非常重要,它排除了当前文章本身,确保推荐的文章是“其他”文章。
-
ORDER BY weight DESC, click DESCweight DESC:按文章的权重(weight字段)从高到低排序,权重高的文章会优先显示。, click DESC:如果权重相同,则按点击量(click字段)从高到低排序。- 你可以根据需要修改排序规则,
pubdate DESC(按发布时间)。
-
LIMIT 0,10- 从第0条记录开始,取10条,也就是只显示10篇相关文章,你可以修改
10来调整显示数量。
- 从第0条记录开始,取10条,也就是只显示10篇相关文章,你可以修改
第3步:优化和注意事项
- 性能考虑:如果网站文章非常多,
regexp操作可能会对数据库造成一定压力,但对于大多数中小型网站来说,影响微乎其微。 - 关键词格式:确保你的文章关键词格式统一(比如都用逗号分隔),这样SQL查询会更稳定。
- 表前缀:再次强调,请务必将
dede_archives修改为你自己网站的数据表前缀。 - 美观样式:上述代码只提供了HTML结构,你可以通过CSS来美化
.related-articles的样式,使其与你的网站风格保持一致。
总结与对比
| 特性 | 方法一 ({dede:likearticle}) |
方法二 ({dede:sql}) |
|---|---|---|
| 实现难度 | 非常简单,零代码基础可用 | 需要理解基本SQL和模板标签 |
| 功能灵活性 | 较低,功能固定 | 极高,可自定义查询条件、排序、排除项等 |
| 性能 | 织梦内部优化,性能尚可 | 取决于SQL语句复杂度和数据量,通常良好 |
| 推荐度 | 适合新手或快速实现 | 强烈推荐给所有用户,尤其是对功能有要求的 |
最终建议:
如果你只是想要一个简单的相关文章列表,用方法一足够了。
如果你希望获得更好的用户体验,比如排除当前文章、优先推荐权重高的文章,或者想学习更高级的织梦技巧,请毫不犹豫地选择方法二,它虽然多写几行代码,但带来的功能提升和掌控感是完全值得的。
