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

修改核心文件,增强 likearticle 标签功能 (推荐)
这种方法通过修改 arc.archives.class.php 文件,为 likearticle 标签增加一个新的属性,使其可以调用全站数据,这是最规范、最灵活的方案。
第1步:找到并修改核心文件
-
文件位置:
include/arc.archives.class.php -
修改代码: 用代码编辑器(如VS Code, Sublime Text, Dreamweaver)打开这个文件。
-
查找函数: 在文件中搜索
function GetLikeArticle函数,这个函数就是处理likearticle标签逻辑的核心。
(图片来源网络,侵删) -
修改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"; // ... 函数结尾部分 ... -
替换为新的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 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的 示例:调用全站点击最高的10篇文章 示例:调用全站被“顶”最高的8篇文章 注意事项: 最终建议:
为了网站的长期维护和扩展性,强烈推荐使用方法一,虽然需要修改一次核心文件,但之后你就可以像使用原生标签一样,轻松地在任何模板中调用全站的热门文章,非常方便,修改核心文件前,务必备份原文件,以防万一。loop
{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}
{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。
规范性
高,符合DedeCMS的标签扩展机制。
低,直接在模板中写SQL,不够规范。
维护性
高,标签化调用,易于维护和移植。
低,代码散落在模板中,不易管理。
性能
相同,最终都是执行一次SQL查询。
相同。
推荐度
★★★★★ (强烈推荐)
★★☆☆☆ (临时或简单需求)
