dede如何调用相同tag标签的文章?

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

使用 {dede:likearticle} 标签(最推荐、最简单)

这是DedeCMS内置的专门用于调用相关文章的标签,其原理就是根据当前文章的标签来查找其他包含相同标签的文章,使用起来非常方便。

dede如何调用相同tag标签的文章
(图片来源网络,侵删)

适用场景页(article_article.htm)中,显示与当前文章相关的文章列表。

实现步骤

  1. 打开文章模板文件 找到并打开你当前使用的文章内容页模板,通常是 /templets/default/article_article.htm

  2. 添加 {dede:likearticle} 在你希望显示“相关文章”的位置,添加以下代码:

    <div class="related-article">
        <h3>相关文章</h3>
        <ul>
            {dede:likearticle row='10' titlelen='42'}
            <li>
                <a href="[field:arcurl/]">[field:title/]</a>
                <span>([field:pubdate function="MyDate('Y-m-d', @me)"/])</span>
            </li>
            {/dede:likearticle}
        </ul>
    </div>
  3. 标签参数说明

    • row='10':表示调用10篇相关文章,你可以根据需要修改这个数字。
    • titlelen='42':表示文章标题的字符长度,超过这个长度的会自动截断并加上“...”,你也可以使用 infolen 来截断摘要。
    • typeid='':可以指定调用某个栏目ID下的相关文章,留空则表示不限制栏目。
    • orderby='':排序方式,默认是 rand(随机),你也可以使用 click(按点击量)、pubdate(按发布日期)等。

优点

  • 代码最简单:无需额外修改任何PHP文件。
  • 性能较好:这是系统内置的标签,经过了优化。
  • 功能强大:能满足大部分相关文章的调用需求。

使用 {ded:tag} 自定义SQL标签(灵活、功能强大)

{dede:likearticle} 标签不能满足你的特殊需求(比如需要自定义排序、筛选条件等),你可以使用自定义SQL标签来实现。

dede如何调用相同tag标签的文章
(图片来源网络,侵删)

适用场景

  • 需要更灵活地控制查询逻辑,比如按点击量排序、排除当前文章、调用特定数量的标签等。

实现步骤

  1. 在模板中添加自定义标签 在模板文件中,使用 {dede:sql} 标签来执行自定义的SQL查询。

    <div class="related-article-by-tag">
        <h3>按标签相关的文章</h3>
        <ul>
            {dede:sql sql="
                SELECT a.id, a.title, a.arcurl, a.pubdate
                FROM `dede_archives` a
                LEFT JOIN `dede_taglist` b ON a.id = b.aid
                WHERE b.tag IN (
                    SELECT tag FROM `dede_taglist` WHERE aid = '~id~'
                )
                AND a.id != ~id~
                GROUP BY a.id
                ORDER BY a.click DESC
                LIMIT 10
            "}
            <li>
                <a href="[field:arcurl/]">[field:title/]</a>
                <span>([field:pubdate function="MyDate('Y-m-d', @me)"/])</span>
            </li>
            {/dede:sql}
        </ul>
    </div>
  2. SQL语句解析

    • SELECT a.id, a.title, a.arcurl, a.pubdate:从文章表 (dede_archives) 中选择需要的字段。
    • FROMdede_archivesa LEFT JOINdede_taglistb ON a.id = b.aid:关联文章表和标签表,通过文章ID (aid) 进行连接。
    • WHERE b.tag IN (SELECT tag FROMdede_taglistWHERE aid = '~id~'):这是核心逻辑,它先找出当前文章(aid = '~id~')的所有标签,然后筛选出其他文章(a.id != ~id~)也包含这些标签的文章。
    • GROUP BY a.id:对结果进行分组,确保每篇文章只显示一次。
    • ORDER BY a.click DESC:按点击量降序排列,你也可以改成 a.pubdate DESC 按发布时间排序。
    • LIMIT 10:限制只返回10条结果。
  3. 传递当前文章ID 上面的SQL中 ~id~ 是一个占位符,DedeCMS会自动将其替换为当前文章的ID,你不需要手动处理,系统会自动完成。

优点

  • 灵活性极高:可以完全自定义SQL查询,实现任何复杂的逻辑。
  • 性能可控:可以通过添加索引和优化查询语句来提升性能。

缺点

  • 代码稍复杂:需要懂一些基本的SQL语法。
  • 有一定风险:错误的SQL可能导致网站出错,需要谨慎。

使用全局变量 $tagsGetTags() 函数(传统方法)

这是一种比较传统的实现方式,通过先获取当前文章的所有标签,然后循环调用每个标签的文章。

dede如何调用相同tag标签的文章
(图片来源网络,侵删)

适用场景

  • 适用于旧版本的DedeCMS,或者需要为每个标签单独调用文章列表的场景。

实现步骤

  1. 获取当前文章的标签 需要在模板中通过PHP代码获取当前文章的标签列表,并将其存入一个数组。

    <div class="related-article-traditional">
        <h3>传统方法调用相关文章</h3>
        <ul>
            <?php
            $tags = '';
            $tagsArr = array();
            // 获取当前文章的标签
            $dsql->SetQuery("SELECT tag FROM `dede_taglist` WHERE aid = @me");
            $dsql->Execute('tag');
            while($row = $dsql->GetArray('tag'))
            {
                $tags .= ($tags == '' ? $row['tag'] : ','.$row['tag']);
                $tagsArr[] = $row['tag'];
            }
            ?>
            {dede:arclist titlelen='42' row='10'}
            <li>
                <a href="[field:arcurl/]">[field:title/]</a>
            </li>
            {/dede:arclist}
        </ul>
    </div>

    注意:上面的方法只是一个示例框架,{dede:arclist} 本身不支持直接按标签数组查询,通常需要结合PHP循环和多次查询来实现,代码会非常臃肿,不推荐在现代开发中使用。

    更传统(但更过时)的做法是,在文章页通过 GetTags() 函数获取标签字符串,然后在后台通过自定义函数处理,这种方式非常繁琐,性能也较差。

优点

  • 理论上可以实现。

缺点

  • 代码极其复杂且臃肿
  • 性能最差:需要进行多次数据库查询。
  • 维护困难:可读性差,容易出错。

总结与推荐

方法 优点 缺点 推荐度
{dede:likearticle} 代码简单、性能好、官方推荐 灵活性相对较低 ⭐⭐⭐⭐⭐ (首选)
{dede:sql} 灵活性强、功能强大 需要SQL知识,有出错风险 ⭐⭐⭐⭐ (特殊需求时使用)
传统方法 无明显优点 代码复杂、性能差、不维护 (不推荐)

对于绝大多数情况,请直接使用方法一 {dede:likearticle},它是最简单、最稳定、最高效的解决方案,只有在需要 {dede:likearticle} 无法满足的特殊功能时,才考虑使用方法二。

-- 展开阅读全文 --
头像
织梦古典水墨学校模板如何适配dedecms?
« 上一篇 昨天
dede列表如何调用下级栏目的全部列表?
下一篇 » 昨天

相关文章

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