使用内置的 likearticle 标签(最推荐、最简单)
DedeCMS 自带了一个非常强大的 likearticle 标签,它不仅可以调用同栏目的文章,还可以通过参数调用同标签的文章,这是最简单、最官方的实现方式。

(图片来源网络,侵删)
标签代码
{dede:likearticle row='10' titlelen='50'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:likearticle}
参数说明
row='10':调用的文章数量,这里设置为 10 篇,你可以根据需要修改,len='50'`:文章标题的长度,这里设置为 50 个字符,如果标题过长,会被截断。col='':分列,通常不需要设置,默认单列显示。infolen='':简介长度,不设置则不显示简介。imgwidth=''和imgheight='':缩略图的宽度和高度,不设置则不显示缩略图。type='':这是实现“相同标签”的关键参数!type='all':调用所有栏目的相关文章(默认值)。type='same':只调用同栏目下的相关文章。type='tag':只调用同标签下的相关文章。我们通常需要这个。
完整示例(调用同标签文章,并显示缩略图)
<h3>相关文章</h3>
<ul class="related-article-list">
{dede:likearticle row='5' titlelen='40' imgwidth='120' imgheight='80' type='tag'}
<li>
<a href="[field:arcurl/]">
<img src="[field:litpic/]" alt="[field:title/]" width="120" height="80">
<span>[field:title/]</span>
</a>
</li>
{/dede:likearticle}
</ul>
优点:
- 简单快捷:无需任何修改,直接在模板中使用。
- 性能较好:官方标签,经过优化。
- 功能强大:可以灵活组合
type、row等参数。
使用 arclist 标签 + 自定义SQL(更灵活、更强大)
likearticle 标签不能满足你的特殊需求(你需要更复杂的排序、排除某些文章等),你可以使用 arclist 标签配合自定义SQL来实现。
标签代码
{dede:arclist row='10' titlelen='50'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
关键:如何设置 typeid 和 keyword
arclist 标签本身没有直接调用同标签的参数,我们需要通过 typeid 和 keyword 参数来间接实现。
-
获取当前文章的ID: 在文章内容页模板(
article_article.htm)中,当前文章的ID可以通过全局变量$arcid获取。
(图片来源网络,侵删) -
获取当前文章的所有标签: 你需要写一小段PHP代码,查询与当前文章ID相关的所有标签,然后将这些标签组合成一个字符串,赋值给
arclist的keyword参数。
完整实现步骤
-
在模板中插入PHP代码: 在你需要调用相关文章的位置(通常是文章内容下方),先插入一段PHP代码来获取标签。
<h3>相关文章 (arclist实现)</h3> <ul class="related-article-list"> <?php // 1. 获取当前文章ID $arcid = $arcid; // 2. 查询当前文章的所有tag $tags = ''; $dsql->SetQuery("SELECT tag FROM `dede_taglist` WHERE aid = '$arcid'"); $dsql->Execute(); while ($row = $dsql->GetArray()) { $tags .= $row['tag'] . ' '; // 用空格分隔多个标签 } $tags = trim($tags); ?> {dede:arclist row='5' titlelen='40' keyword='$tags' typeid='-1' order='rand'} <li> <a href="[field:arcurl/]">[field:title/]</a> </li> {/dede:arclist} </ul>
代码解释
<?php ... ?>:这是PHP代码块,用于在模板中执行PHP逻辑。$arcid = $arcid;:获取DedeCMS内置的当前文章ID变量。$dsql->SetQuery(...):执行SQL查询,从dede_taglist表中查找当前文章 (aid = '$arcid') 对应的所有标签 (tag)。$tags .= $row['tag'] . ' ';:将查询到的每个标签用空格连接起来,形成一个关键词字符串,如果文章有标签 "织梦" 和 "教程",$tags的值就是 "织梦 教程"。{dede:arclist keyword='$tags' ...}:这是核心。keyword='$tags':将上面生成的标签字符串作为关键词传给arclist。arclist会调用标题或关键词中包含这些词的文章。typeid='-1':表示调用所有栏目的文章,不受栏目限制。order='rand':随机排序,让相关文章列表每次刷新都不同,增加趣味性,你也可以用id按ID排序。
优点:
- 极度灵活:可以结合任何SQL查询和
arclist的其他参数。 - 控制力强:可以实现
likearticle无法完成的复杂逻辑。
缺点:

(图片来源网络,侵删)
- 相对复杂:需要懂一点PHP和SQL。
- 性能考量:如果文章和标签非常多,每次页面加载都执行一次查询,可能会有轻微的性能影响,但通常可以忽略不计。
使用 loop 标签 + 原生SQL(性能最高、最底层)
这是性能最高,但也最复杂的方法,它直接绕过DedeCMS的标签解析,直接执行原生SQL查询并循环输出结果。
标签代码
<h3>相关文章 (loop实现)</h3>
<ul class="related-article-list">
{dede:loop table='dede_archives a, dede_taglist t' sort='a.id' row='5'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:loop}
</ul>
这种方法不能直接实现“同标签”,需要结合PHP。
完整实现步骤
与方法二类似,你需要先用PHP获取当前文章的标签ID列表,然后将其拼接到SQL的 WHERE 条件中。
<h3>相关文章 (loop实现)</h3>
<ul class="related-article-list">
<?php
$arcid = $arcid;
$tagids = array();
// 1. 查询当前文章对应的tagid
$dsql->SetQuery("SELECT tid FROM `dede_taglist` WHERE aid = '$arcid'");
$dsql->Execute();
while ($row = $dsql->GetArray()) {
$tagids[] = $row['tid'];
}
// 2. 如果找到了标签,则构建SQL
if (!empty($tagids)) {
// 将数组转换为逗号分隔的字符串,'1,5,8'
$tagids_str = implode(',', $tagids);
// 3. 执行查询,找出拥有相同tagid的文章(排除当前文章)
$sql = "SELECT a.id, a.title, a.arcurl
FROM `dede_archives` a
LEFT JOIN `dede_taglist` t ON a.id = t.aid
WHERE t.tid IN ($tagids_str) AND a.id != $arcid
GROUP BY a.id
ORDER BY a.id DESC
LIMIT 5";
$dsql->SetQuery($sql);
$dsql->Execute('taglist');
// 4. 使用loop标签输出结果
?>
{dede:loop table='@taglist' sort='' row='5'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:loop}
<?php
} else {
echo '<li>暂无相关文章</li>';
}
?>
</ul>
代码解释
tagids = array(): 创建一个空数组,用来存放标签ID。$tagids_str = implode(',', $tagids): 将tagid数组转换成1,5,8这样的字符串,用于SQL的IN语句。LEFT JOIN ... ON a.id = t.aid: 关联archives(文章表) 和taglist(标签关联表)。WHERE t.tid IN ($tagids_str) AND a.id != $arcid:WHERE子句是核心,它筛选出tagid在我们找到的列表中,并且文章ID不等于当前文章ID的记录。GROUP BY a.id: 防止一篇文章有多个相同标签而被重复调用。{dede:loop table='@taglist' ...}:@taglist是一个特殊写法,表示使用上面通过$dsql->Execute('taglist')执行的查询结果作为数据源。
优点:
- 性能最优:直接执行最精简的SQL,效率最高。
- 控制力最强:可以写出任何你想要的复杂查询逻辑。
缺点:
- 非常复杂:需要扎实的PHP和SQL功底。
- 可读性差:模板中混入大量PHP代码,不易维护。
总结与推荐
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
likearticle |
简单、快捷、官方 | 灵活性相对较低 | 绝大多数情况下的首选,能满足90%的需求。 |
arclist + PHP |
灵活、可结合arclist所有功能 |
需要PHP基础,稍复杂 | 当 likearticle 无法满足特殊排序、过滤等需求时。 |
loop + PHP |
性能最高、控制力最强 | 极其复杂、不易维护 | 对性能有极致要求,且逻辑非常复杂的特殊场景。 |
给您的建议:
- 首选方法一 (
likearticle):直接在你的文章模板(article_article.htm)中复制粘贴修改后的代码即可,这是最标准、最省事的解决方案。 - 如果你对方法一的效果不满意(比如排序方式、显示内容等),再考虑方法二 (
arclist+ PHP)。 - 除非你是一个经验丰富的开发者,并且遇到了性能瓶颈,否则不建议在普通项目中使用方法三。
希望这个详细的解答能帮助到您!
