dede likearticle如何调用全站文章?

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

以下是实现调用全站热门文章的详细步骤,分为核心代码修改法SQL直接查询法两种,推荐使用第一种,因为它更灵活且符合Dede的设计模式。

dede likearticle调用全站
(图片来源网络,侵删)

修改核心文件,增强 likearticle 标签功能 (推荐)

这种方法通过修改 arc.archives.class.php 文件,为 likearticle 标签增加一个新的属性,使其可以调用全站数据,这是最规范、最灵活的方案。

第1步:找到并修改核心文件

  1. 文件位置include/arc.archives.class.php

  2. 修改代码: 用代码编辑器(如VS Code, Sublime Text, Dreamweaver)打开这个文件。

  3. 查找函数: 在文件中搜索 function GetLikeArticle 函数,这个函数就是处理 likearticle 标签逻辑的核心。

    dede likearticle调用全站
    (图片来源网络,侵删)
  4. 修改SQL查询语句: 找到函数内部的SQL查询语句,它大概长这样(不同版本Dede略有差异):

    // ... 函数开头部分 ...
    $query = "SELECT arc.id,arc.title,arc.typeid,arc.litpic,arc.pubdate,arc.click 
              FROM `#@__archives` arc 
              LEFT JOIN `#@__arctype` tp ON arc.typeid=tp.id 
              WHERE arc.arcrank > -1 AND tp.ishidden<>1 
              ORDER BY arc.click DESC 
              LIMIT 0, $row";
    // ... 函数结尾部分 ...
  5. 替换为新的SQL语句: 我们需要修改这个SQL,让它不再限制 typeid,并可以按不同的字段排序,修改后的 GetLikeArticle 函数应该是这样的:

    // ... 函数开头部分 ...
    // 增加一个参数 $orderby,用于指定排序字段,默认为 click
    function GetLikeArticle($typeid = 0, $row = 10, $col = 1, $titlelen = 30, $infolen = 150, $imgwidth = 120, $imgheight = 90, $type = 'all', $orderby = 'click', $innertext = '', $aid = 0)
    {
        global $dsql;
        $innertext = trim($innertext);
        if ($innertext == '') {
            $innertext = GetSysTemplets('likearticle.htm');
        }
        // 过滤掉一些不常用的属性,简化逻辑
        $typeid = (int)$typeid;
        $row = (int)$row;
        $col = (int)$col;
        $titlelen = (int)$titlelen;
        $infolen = (int)$infolen;
        $imgwidth = (int)$imgwidth;
        $imgheight = (int)$imgheight;
        $aid = (int)$aid;
        // 如果指定了栏目ID,则只查询该栏目
        $typeaddsql = ($typeid > 0) ? " And arc.typeid IN($typeid) " : '';
        // --- 关键修改部分 ---
        // 根据传入的 $orderby 参数决定排序方式
        if ($orderby == 'click') {
            $ordersql = " ORDER BY arc.click DESC ";
        } elseif ($orderby == 'goodpost') {
            // 'goodpost' 是 DedeCMS 存储顶/赞的字段
            $ordersql = " ORDER BY arc.goodpost DESC ";
        } elseif ($orderby == 'badpost') {
            // 'badpost' 是 DedeCMS 存踩的字段
            $ordersql = " ORDER BY arc.badpost DESC ";
        } elseif ($orderby == 'lastpost') {
            // 按最后评论时间排序
            $ordersql = " ORDER BY arc.lastpost DESC ";
        } else {
            // 默认按点击排序
            $ordersql = " ORDER BY arc.click DESC ";
        }
        $query = "SELECT arc.id,arc.title,arc.typeid,arc.litpic,arc.pubdate,arc.click,arc.goodpost,arc.badpost,arc.lastpost 
                  FROM `#@__archives` arc 
                  LEFT JOIN `#@__arctype` tp ON arc.typeid=tp.id 
                  WHERE arc.arcrank > -1 AND tp.ishidden<>1 {$typeaddsql} 
                  {$ordersql} 
                  LIMIT 0, $row";
        $dsql->SetQuery($query);
        $dsql->Execute();
        $artlist = '';
        $index = 0;
        while ($row = $dsql->GetArray()) {
            $index++;
            // ... 后面的模板处理逻辑保持不变 ...
        }
        return $artlist;
    }
    // ... 函数结尾部分 ...

    修改说明

    • 我们为函数增加了一个 $orderby 参数,默认值为 'click'
    • 我们根据 $orderby 的值来动态构建 ORDER BY 子句。
    • $typeid 为0(默认值),则 typeaddsql 为空,SQL查询就不受栏目限制,从而实现全站调用。
    • 我们在 SELECT 中也增加了 goodpost, badpost, lastpost 等字段,以便在模板中使用。

第2步:在模板中使用增强后的标签

你可以在任何模板文件(如首页、列表页、内容页)中使用这个功能强大的 likearticle 标签了。

dede likearticle调用全站
(图片来源网络,侵删)

调用全站被“顶”次数最多的文章:

{dede:likearticle row='8' col='2' titlelen='30' imgwidth='120' imgheight='90' orderby='goodpost'}
    <li>
        [field:picname/]
        <a href="[field:arcurl/]" title="[field:title/]">[field:title function='cn_substr(@me,30)'/]</a>
        <span>顶:[field:goodpost/]</span>
    </li>
{/dede:likearticle}

调用全站点击量最高的文章:

{dede:likearticle row='10' titlelen='40' orderby='click'}
    <a href="[field:arcurl/]" title="[field:title/]">[field:title function='cn_substr(@me,40)'/]</a>
{/dede:likearticle}

参数说明

  • orderby='goodpost': 按顶的数量从高到低排序。
  • orderby='click': 按点击量从高到低排序。
  • orderby='lastpost': 按最后评论时间排序。
  • typeid='0': 可以省略,默认就是全站,如果你想指定某个栏目,就写上栏目ID,如 typeid='5'
  • 其他参数(row, col, titlelen 等)与原标签用法完全一致。

直接使用SQL调用 (简单直接)

如果你不想修改核心文件,或者只需要在某个特定地方调用一次,可以直接在模板里写SQL,这种方法灵活性较差,但无需修改系统文件。

在模板中直接写SQL

在需要调用热门文章的地方,直接使用DedeCMS的 loop

示例:调用全站点击最高的10篇文章

{dede:sql sql='SELECT id,title,click FROM `#@__archives` WHERE arcrank > -1 ORDER BY click DESC LIMIT 0,10'}
    <a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
{/dede:sql}

示例:调用全站被“顶”最高的8篇文章

{dede:sql sql='SELECT id,title,goodpost FROM `#@__archives` WHERE arcrank > -1 ORDER BY goodpost DESC LIMIT 0,8'}
    <li>
        <a href="[field:arcurl/]" title="[field:title/]">[field:title function='cn_substr(@me,30)'/]</a>
        <small>顶数:[field:goodpost/]</small>
    </li>
{/dede:sql}

注意事项

  • arcurl 是DedeCMS的内置函数,用于根据文章ID生成链接,即使你查询的字段里没有它,loop 标签也能正常使用。
  • 这种方法需要你手动写出完整的SQL语句,并且要确保表名前缀(#@__)正确。
  • 每次调用都会执行一次SQL查询,如果在一个页面上多次使用,可能会对网站性能产生轻微影响。

总结与建议

特性 方法一 (修改核心文件) 方法二 (直接SQL)
灵活性 ,可以通过标签属性灵活控制。 ,每次都需要手写SQL。
规范性 ,符合DedeCMS的标签扩展机制。 ,直接在模板中写SQL,不够规范。
维护性 ,标签化调用,易于维护和移植。 ,代码散落在模板中,不易管理。
性能 相同,最终都是执行一次SQL查询。 相同。
推荐度 ★★★★★ (强烈推荐) ★★☆☆☆ (临时或简单需求)

最终建议: 为了网站的长期维护和扩展性,强烈推荐使用方法一,虽然需要修改一次核心文件,但之后你就可以像使用原生标签一样,轻松地在任何模板中调用全站的热门文章,非常方便,修改核心文件前,务必备份原文件,以防万一。

-- 展开阅读全文 --
头像
dedecms文章发布时间怎么改?
« 上一篇 2025-12-02
C语言中itoa函数为何undefined未定义?
下一篇 » 2025-12-02

相关文章

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