dede如何调取相同tag的文章?

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

使用内置的 likearticle 标签(最推荐、最简单)

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

dede 调取相同tag文章
(图片来源网络,侵删)

标签代码

{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>

优点:

  • 简单快捷:无需任何修改,直接在模板中使用。
  • 性能较好:官方标签,经过优化。
  • 功能强大:可以灵活组合 typerow 等参数。

使用 arclist 标签 + 自定义SQL(更灵活、更强大)

likearticle 标签不能满足你的特殊需求(你需要更复杂的排序、排除某些文章等),你可以使用 arclist 标签配合自定义SQL来实现。

标签代码

{dede:arclist row='10' titlelen='50'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
    </li>
{/dede:arclist}

关键:如何设置 typeidkeyword

arclist 标签本身没有直接调用同标签的参数,我们需要通过 typeidkeyword 参数来间接实现。

  1. 获取当前文章的ID: 在文章内容页模板(article_article.htm)中,当前文章的ID可以通过全局变量 $arcid 获取。

    dede 调取相同tag文章
    (图片来源网络,侵删)
  2. 获取当前文章的所有标签: 你需要写一小段PHP代码,查询与当前文章ID相关的所有标签,然后将这些标签组合成一个字符串,赋值给 arclistkeyword 参数。

完整实现步骤

  1. 在模板中插入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':将上面生成的标签字符串作为关键词传给 arclistarclist 会调用标题或关键词中包含这些词的文章。
    • typeid='-1':表示调用所有栏目的文章,不受栏目限制。
    • order='rand':随机排序,让相关文章列表每次刷新都不同,增加趣味性,你也可以用 id 按ID排序。

优点:

  • 极度灵活:可以结合任何SQL查询和 arclist 的其他参数。
  • 控制力强:可以实现 likearticle 无法完成的复杂逻辑。

缺点:

dede 调取相同tag文章
(图片来源网络,侵删)
  • 相对复杂:需要懂一点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 性能最高、控制力最强 极其复杂、不易维护 对性能有极致要求,且逻辑非常复杂的特殊场景。

给您的建议:

  1. 首选方法一 (likearticle):直接在你的文章模板(article_article.htm)中复制粘贴修改后的代码即可,这是最标准、最省事的解决方案。
  2. 如果你对方法一的效果不满意(比如排序方式、显示内容等),再考虑方法二 (arclist + PHP)
  3. 除非你是一个经验丰富的开发者,并且遇到了性能瓶颈,否则不建议在普通项目中使用方法三

希望这个详细的解答能帮助到您!

-- 展开阅读全文 --
头像
dede手机访问域名如何正确设置?
« 上一篇 01-28
C语言实例1010,实例内容是什么?
下一篇 » 01-28

相关文章

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

目录[+]