最常用 - 调用全站热门标签(推荐)
这是最常见的需求,即调用整个网站中使用次数最多的标签。

(图片来源网络,侵删)
核心代码
将以下代码放在您需要显示热门标签的模板文件中(index.htm、article_list.htm 等)。
{dede:sql sql="SELECT * FROM dede_tagindex ORDER by count DESC LIMIT 0,20"}
<a href='/tags.php?/~[field:tagname/]/' title="[field:tagname/] ([field:count/]次)">[field:tagname/]</a>
{/dede:sql}
代码详解
{dede:sql ...}: 这是 DedeCMS 的一个底层模板标签,用于执行自定义的 SQL 查询。sql="...": 这里是我们要执行的 SQL 语句。SELECT * FROM dede_tagindex:dede_tagindex是 DedeCMS 中存储标签信息的核心数据表,count字段记录了每个标签被引用的次数。ORDER by count DESC: 这是关键部分,它表示按照count字段进行降序排列,这样使用次数最多的标签就会排在最前面。LIMIT 0,20: 表示从第 0 条记录开始,只取 20 条,也就是获取前 20 个最热门的标签,你可以根据需要修改这个数字,LIMIT 0,50就是获取前 50 个。
[field:tagname/]: 循环体内,用于输出标签的名称。[field:count/]: 循环体内,用于输出该标签被使用的次数。href='/tags.php?/~[field:tagname]/': 这是标签页面的默认链接格式,如果你的网站开启了伪静态,链接格式可能需要修改为/tags/[field:tagname]/,你可以通过后台的“系统” -> “系统基本参数” -> “核心设置”中的“标签命名规则”来查看或修改。
进阶美化(显示标签使用次数)
为了让用户更直观地看到标签的热门程度,我们可以给标签加上不同的颜色或大小。
示例:给标签加上使用次数的提示
{dede:sql sql="SELECT * FROM dede_tagindex ORDER by count DESC LIMIT 0,30"}
<a href='/tags.php?/~[field:tagname/]/' title="[field:tagname/] ([field:count/]次)">[field:tagname/]</a>
<span style="color:#999; font-size:12px;">([field:count/])</span>
{/dede:sql}
示例:根据使用次数给标签设置不同颜色

(图片来源网络,侵删)
这个稍微复杂一点,需要用到 if 判断,DedeCMS 的 if 标签可以这样用:
{dede:sql sql="SELECT * FROM dede_tagindex ORDER by count DESC LIMIT 0,20"}
<a href='/tags.php?/~[field:tagname/]/'
[field:runphp='yes']
$count = @me;
if($count > 100) @me = 'style="color:red; font-weight:bold;"';
else if($count > 50) @me = 'style="color:orange;"';
else @me = 'style="color:gray;"';
[/field:runphp]
>
[field:tagname/]
</a>
{/dede:sql}
[field:runphp='yes']: 这个标签允许你在模板中执行 PHP 代码。$count = @me;: 获取当前标签的count值。if/else if/else: 进行判断。@me = '...': 将判断结果(即 HTML 样式字符串)赋值给@me变量,最终会作用在标签上。
调用指定栏目下的热门标签
有时候你可能只想显示某个特定栏目下的热门标签,这需要关联 dede_taglist 表。
核心代码
假设你要调用栏目 ID 为 1 的热门标签。
{dede:sql sql="SELECT t.tagname, t.count FROM dede_taglist as tl left join dede_tagindex as t on tl.tagid = t.id WHERE tltypeid = 1 GROUP BY tl.tagid ORDER by t.count DESC LIMIT 0,15"}
<a href='/tags.php?/~[field:tagname/]/' title="[field:tagname/]">[field:tagname/]</a>
{/dede:sql}
代码详解
FROM dede_taglist as tl left join dede_tagindex as t on tl.tagid = t.id:dede_taglist表记录了每个文章和标签的对应关系,typeid字段记录了该文章所在的栏目 ID。- 我们通过
left join将dede_taglist和dede_tagindex连接起来,这样就能同时获取到标签的名称、使用次数以及它所属的栏目。
WHERE tltypeid = 1:- 这是筛选条件,
typeid = 1表示只查找栏目 ID 为 1 的标签。请务必将1替换成你自己的栏目 ID。
- 这是筛选条件,
GROUP BY tl.tagid:- 因为一个标签可能被栏目
1中的多篇文章使用,直接查询会导致结果重复。GROUP BY会将相同的tagid合并为一组,以便后续正确计算count。
- 因为一个标签可能被栏目
ORDER by t.count DESC: 和之前一样,按总使用次数降序排列。
调用当前文章或栏目的相关热门标签
这个需求稍微复杂一些,通常用于文章详情页,显示与当前文章标签相同、其他文章也常使用的标签。
场景页 (article_article.htm),获取当前文章的所有标签,然后找出使用这些标签的其他热门标签。
核心代码
这个方案需要分两步:先获取当前文章的标签ID,再进行查询。
第一步:获取当前文章的标签ID(在循环外)
在 {dede:field.body/} 之前,先执行一个查询来获取当前文章的标签ID列表。
{dede:sql sql="SELECT GROUP_CONCAT(tagid) AS tagids FROM dede_taglist WHERE aid = ~id~"}
{dede:getsql sql="SELECT t.tagname, t.count FROM dede_taglist as tl left join dede_tagindex as t on tl.tagid = t.id WHERE tl.tagid IN ([field:tagids/]) AND tl.aid != ~id~ GROUP BY tl.tagid ORDER by t.count DESC LIMIT 0,10"}
<a href='/tags.php?/~[field:tagname/]/' title="[field:tagname/]">[field:tagname/]</a>
{/dede:getsql}
{/dede:sql}
注意: 上面这种嵌套写法在某些版本的 DedeCMS 中可能不稳定,更推荐使用 PHP 代码片段来实现。
更稳定的方法:使用 PHP 代码
在文章详情页模板 article_article.htm 中,你可以直接插入 PHP 代码。
<?php
$aid = $arcID; // 当前文章ID
$dsql = new DedeSql(false);
// 1. 获取当前文章的所有标签ID
$tagids = '';
$dsql->SetQuery("SELECT GROUP_CONCAT(tagid) FROM dede_taglist WHERE aid = $aid");
$dsql->Execute('t1');
if($row1 = $dsql->GetArray('t1'))
{
$tagids = $row1['GROUP_CONCAT(tagid)'];
}
if($tagids != '')
{
// 2. 查询使用相同标签的其他热门标签,并排除当前文章
$dsql->SetQuery("SELECT t.tagname, t.count FROM dede_taglist as tl left join dede_tagindex as t on tl.tagid = t.id WHERE tl.tagid IN ($tagids) AND tl.aid != $aid GROUP BY tl.tagid ORDER by t.count DESC LIMIT 0,10");
$dsql->Execute('t2');
echo "<div class='related-tags'><strong>相关热门标签:</strong>";
while($row2 = $dsql->GetArray('t2'))
{
echo "<a href='/tags.php/?/{$row2['tagname']}/' title='{$row2['tagname']} ({$row2['count']}次)'>{$row2['tagname']}</a> ";
}
echo "</div>";
}
$dsql->Close();
?>
这段 PHP 代码的逻辑清晰,兼容性也更好。
总结与注意事项
- 性能考虑:
dede_tagindex和dede_taglist表在数据量很大时,频繁的排序查询可能会有性能影响,如果你的网站标签非常多(数万级别),可以考虑使用缓存机制,或者定期(如每天)生成一个热门标签的静态文件。 - 表前缀: 你的数据表前缀可能不是
dede_,请根据你的后台配置进行修改。 - 链接格式: 务必确认你的标签页链接是动态的 (
/tags.php?/tag/) 还是伪静态的 (/tags/tag/),并相应修改href属性。 - 安全: 直接使用
sql标签有潜在的安全风险(如SQL注入),但 DedeCMS 本身对底层标签做了安全过滤,如果你的网站对安全性要求极高,可以考虑将复杂的SQL查询写成自定义函数或插件来调用。
希望这些方法能帮助你成功调用出网站的热门标签!
