下面我将为你提供一种最常用、最稳定且兼容性最好的方法,通过修改 list_article.htm 模板文件来实现。

(图片来源网络,侵删)
核心思路
- 修改模板:在列表页模板中,添加一个排序导航栏(按发布时间、按点击量、按评论数等)。
- 修改标签:将原来的普通列表调用标签
{dede:list}替换为支持排序的自定义函数标签{dede:arclist}。 - 处理URL:通过URL参数(如
? orderby=click)来告诉系统用户选择了哪种排序方式。 - 编写PHP代码:在
include/extend.func.php文件中添加一个自定义函数,这个函数会根据URL参数动态生成排序后的SQL语句。
详细步骤
第一步:创建自定义函数 GetOrderSql
这个函数是实现排序功能的核心。
- 打开你的DedeCMS后台目录,找到并打开
include/extend.func.php文件。 - 在文件的最后面(
?>之前)添加以下PHP代码:
/**
* 根据URL参数获取排序的SQL子句
* @return string 排序的SQL子句,如 ' ORDER BY click DESC'
*/
function GetOrderSql()
{
// 获取排序方式参数,默认为按发布时间降序
$orderby = isset($_GET['orderby']) ? trim($_GET['orderby']) : 'pubdate';
// 定义允许的排序字段和对应的SQL排序方式
$orderMap = array(
'hot' => 'click DESC', // 按点击量(热门)降序
'score' => 'scores DESC', // 按评分降序
'good' => 'goodpost DESC', // 按好评降序
'bad' => 'badpost DESC', // 按差评降序
'rand' => 'rand()', // 随机排序
'pubdate'=> 'pubdate DESC', // 按发布时间降序
'lastpost' => 'lastpost DESC', // 按最后评论时间降序
);
// 检查请求的排序方式是否在允许的列表中
if (isset($orderMap[$orderby])) {
return ' ORDER BY ' . $orderMap[$orderby];
}
// 如果不在列表中,则使用默认排序
return ' ORDER BY pubdate DESC';
}
代码解释:
- 我们通过
$_GET['orderby']获取URL中的排序参数。 $orderMap数组定义了所有允许的排序方式,键是URL中的值(如hot),值是对应的数据库排序语句(如click DESC)。- 使用
isset()来检查用户请求的排序方式是否安全有效,防止SQL注入。 - 最后返回一个完整的SQL排序子句,如
ORDER BY click DESC。
第二步:修改列表页模板 list_article.htm
现在我们来修改模板文件,添加排序链接并调用新的函数。
- 进入DedeCMS后台,【模板】->【默认模板管理】,找到你当前使用的列表页模板(通常是
list_article.htm),点击【修改】。 - 在模板中合适的位置(通常是列表标题的上方或下方)添加排序导航的HTML代码。
<div class="sort-nav">
<span>排序方式:</span>
<a href="{dede:global.cfg_cmspath/}/plus/list.php?tid={dede:field.id/}" {dede:global name='orderby' function='IsOrderThis(@me, "pubdate")'/}>默认</a>
|
<a href="{dede:global.cfg_cmspath/}/plus/list.php?tid={dede:field.id/}&orderby=hot" {dede:global name='orderby' function='IsOrderThis(@me, "hot")'/}>最热</a>
|
<a href="{dede:global.cfg_cmspath/}/plus/list.php?tid={dede:field.id/}&orderby=score" {dede:global name='orderby' function='IsOrderThis(@me, "score")'/}>评分</a>
|
<a href="{dede:global.cfg_cmspath/}/plus/list.php?tid={dede:field.id/}&orderby=rand" {dede:global name='orderby' function='IsOrderThis(@me, "rand")'/}>随机</a>
</div>
代码解释:

(图片来源网络,侵删)
{dede:global.cfg_cmspath/}:获取网站根目录,确保链接正确。?tid={dede:field.id/}:获取当前栏目的ID,确保链接跳转到正确的列表页。&orderby=hot:这是我们自定义的排序参数,点击这个链接就会调用我们第一步中定义的GetOrderSql函数,并生成ORDER BY click DESC的SQL。{dede:global name='orderby' function='IsOrderThis(@me, "hot")'/}:这是一个辅助函数,用于给当前选中的排序项添加高亮样式(比如加粗或改变颜色),我们需要在下一步创建它。
第三步:创建高亮辅助函数 IsOrderThis
为了让用户知道当前正在使用哪种排序方式,我们需要一个函数来给对应的链接添加样式。
- 同样在
include/extend.func.php文件中,添加以下函数:
/**
* 用于判断当前排序方式是否与指定方式匹配,如果匹配则返回样式,否则返回空
* @param string $currentOrder 当前页面的排序方式
* @param string $targetOrder 需要判断的目标排序方式
* @return string 如果匹配返回 'class="current"',否则返回空字符串
*/
function IsOrderThis($currentOrder, $targetOrder)
{
// 从URL中获取实际的orderby参数,如果没有则默认为'pubdate'
$orderby = isset($_GET['orderby']) ? trim($_GET['orderby']) : 'pubdate';
if ($orderby == $targetOrder) {
return 'class="current"';
}
return '';
}
- 修改第二步中的HTML,为
<a>标签应用这个函数:
<a href="..." {dede:global name='orderby' function='IsOrderThis(@me, "hot")'/}>最热</a>
- 在CSS文件中为
.current类添加样式,
.sort-nav a.current {
color: #ff6600; /* 当前项的颜色 */
font-weight: bold; /* 当前项加粗 */
text-decoration: none; /* 去掉下划线 */
}
第四步:替换列表调用标签
这是最后也是最关键的一步,将原来的 {dede:list} 标签替换为 {dede:arclist},并应用我们自定义的排序函数。
- 在
list_article.htm模板中,找到原来的列表调用代码,它看起来大概是这样的:
{dede:list pagesize='20'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:click/]</span>
</li>
{/dede:list}
将其替换为以下代码:
{dede:arclist pagesize='20' titlelen='60'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>点击:[field:click/]</span>
</li>
{/dede:arclist}
重要提示:

(图片来源网络,侵删)
{dede:list}和{dede:arclist}的字段调用方式(如[field:title/])是基本相同的。- 我们直接去掉了
{dede:list}标签中默认的orderby=''属性,因为我们通过自定义函数GetOrderSql来动态控制排序。 - 确保你的列表页模板使用的是
{dede:arclist},而不是{dede:list},很多模板默认就是arclist,所以这一步可能只是确认。
完成以上四个步骤后,你的DedeCMS列表页就已经成功实现了多种排序功能。
流程回顾:
extend.func.php:添加GetOrderSql()函数生成排序SQL,添加IsOrderThis()函数实现当前项高亮。list_article.htm:- 添加排序导航的HTML链接,链接中包含
&orderby=xxx参数。 - 使用
{dede:global name='orderby' function='IsOrderThis(...)'}为当前链接添加高亮样式。 - 将列表调用标签从
{dede:list}改为{dede:arclist}。
- 添加排序导航的HTML链接,链接中包含
- CSS:为高亮样式(如
.current)添加CSS定义。
这种方法的好处是代码清晰、修改范围小、不涉及核心文件,升级DedeCMS时不容易丢失修改。
