dede标签如何调用热门tag标签?

99ANYc3cd6
预计阅读时长 20 分钟
位置: 首页 DEDE建站 正文

最常用 - 调用全站热门标签(推荐)

这是最常见的需求,即调用整个网站中使用次数最多的标签。

dede tag标签调用热门
(图片来源网络,侵删)

核心代码

将以下代码放在您需要显示热门标签的模板文件中(index.htmarticle_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}

示例:根据使用次数给标签设置不同颜色

dede tag标签调用热门
(图片来源网络,侵删)

这个稍微复杂一点,需要用到 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>
    &nbsp;
{/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 joindede_taglistdede_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 代码的逻辑清晰,兼容性也更好。


总结与注意事项

  1. 性能考虑: dede_tagindexdede_taglist 表在数据量很大时,频繁的排序查询可能会有性能影响,如果你的网站标签非常多(数万级别),可以考虑使用缓存机制,或者定期(如每天)生成一个热门标签的静态文件。
  2. 表前缀: 你的数据表前缀可能不是 dede_,请根据你的后台配置进行修改。
  3. 链接格式: 务必确认你的标签页链接是动态的 (/tags.php?/tag/) 还是伪静态的 (/tags/tag/),并相应修改 href 属性。
  4. 安全: 直接使用 sql 标签有潜在的安全风险(如SQL注入),但 DedeCMS 本身对底层标签做了安全过滤,如果你的网站对安全性要求极高,可以考虑将复杂的SQL查询写成自定义函数或插件来调用。

希望这些方法能帮助你成功调用出网站的热门标签!

-- 展开阅读全文 --
头像
织梦忘记登录密码,后台如何找回?
« 上一篇 今天
C语言如何调用Gnuplot实现数据可视化?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]