要实现自定义排序,主要有两种方法:

- 简单方法:修改系统文件 - 适合对代码有一定了解,且希望修改后所有地方都生效的用户。
- 推荐方法:使用自定义字段 + SQL修改 - 这是最灵活、最推荐的方法,不破坏核心文件,且可以针对不同栏目设置不同的排序方式。
下面我将详细讲解这两种方法。
修改系统文件(直接修改排序选项)
这种方法会直接修改织梦的核心文件,添加一个新的排序选项,按自定义排序”。
步骤 1:修改 arc.listview.class.php 文件
这个文件负责处理列表页的排序逻辑。
-
找到文件:
/include/arc.listview.class.php
(图片来源网络,侵删) -
修改代码: 在这个文件中,找到
function __construct构造函数,里面有一大段关于$this->orders的数组定义,我们需要在这个数组里添加我们自己的排序方式。找到类似这样的代码(版本不同,代码行数可能略有差异):
// 对排序进行初始化 $orders = array( 'hot' => 'hot', 'click' => 'click', 'pubdate' => 'pubdate DESC', 'lastpost' => 'lastpost', 'score' => 'score', ); -
添加自定义排序: 在
$orders数组中,添加一个新的键值对,我们添加一个名为sortrank的排序方式,它对应数据库中的sortrank字段(织梦默认有这个字段,用于控制后台的“排序”权重)。$orders = array( 'sortrank' => 'sortrank', // 新增这一行 'hot' => 'hot', 'click' => 'click', 'pubdate' => 'pubdate DESC', 'lastpost' => 'lastpost', 'score' => 'score', );
步骤 2:修改模板文件 list_article.htm
我们需要在前端模板中,让用户可以选择这个新的排序方式。

-
找到文件:
/templets/default/list_article.htm(或者你当前使用模板目录下的文件) -
修改排序下拉框: 找到包含排序选项的
<select>下拉框,通常在list_sort标签内,在<option>标签中添加一个新的选项。找到类似这样的代码:
<select name="orderby" id="orderby"> <option value="sortrank">排序</option> <option value="hot">人气</option> <option value="click">点击</option> <option value="pubdate">发布时间</option> </select> -
添加新选项: 注意,这里的
value值必须和我们第一步在arc.listview.class.php中添加的键名一致。<select name="orderby" id="orderby"> <option value="sortrank">自定义排序</option> <!-- 修改显示文字 --> <option value="hot">人气</option> <option value="click">点击</option> <option value="pubdate">发布时间</option> </select>
步骤 3:清理缓存
修改完文件后,登录织梦后台,点击顶部菜单的 “系统” -> “一键更新网站”,然后选择 “更新系统缓存” 并执行。
总结方法一:
- 优点:简单直接,一次修改,全局生效。
- 缺点:
- 直接修改核心文件,升级织梦时可能会被覆盖。
- 不够灵活,无法针对不同栏目设置不同的排序字段。
使用自定义字段 + SQL修改(推荐)
这种方法更灵活,不破坏核心文件,可以实现“每个栏目都能选择不同的排序字段”。
步骤 1:在栏目中添加自定义字段
我们要让栏目管理员可以选择排序的字段。
-
进入栏目管理: 登录织梦后台,点击 “核心” -> “频道模型” -> “内容模型管理”。
-
修改文章模型: 找到并点击 “普通文章” 模型,进入编辑页面。
-
添加字段: 在字段列表下方,点击 “添加新字段”。
- 字段名:
article_orderby(建议用英文,不能和已有字段重复) - 字段类型:
下拉菜单 - 字段说明:
文章排序方式 - 默认值:
sortrank(可以设置一个默认值) - 选项(一行一个):
按排序权重|sortrank 按发布时间|pubdate 按点击数|click 按标题|title 按ID|id(你可以根据需要添加更多选项)
- 字段名:
-
生成栏目: 添加完字段后,点击左下角的 “生成栏目HTML”,让新字段在后台生效。
-
为栏目设置值: 进入 “栏目管理”,编辑你想要应用自定义排序的栏目,在“常规选项”或“高级选项”中,你刚才添加的 “文章排序方式” 字段就会出现,为你需要的栏目选择一个默认的排序方式。
步骤 2:修改列表页模板文件 list_article.htm
我们需要修改模板,让它从当前栏目的自定义字段中读取排序方式。
-
找到文件:
/templets/default/list_article.htm -
修改排序逻辑: 找到
{dede:list}标签,默认情况下,它可能长这样:{dede:list pagesize='10' titlelen='40'}我们需要给它增加一个
orderby属性,并且这个属性的值来自当前栏目的自定义字段article_orderby。修改为:
{dede:list pagesize='10' titlelen='40' orderby=field(article_orderby,sortrank)}orderby=field(article_orderby,sortrank):这句代码的意思是,获取当前栏目的article_orderby字段的值,并将其作为orderby的参数,如果获取不到,则使用默认的sortrank。
更高级的写法(完全动态): 如果你想让排序方向(升序/降序)也由后台控制,可以创建一个
article_orderway字段(类型为单选按钮,选项升序|asc,降序|desc),然后这样写:{dede:list pagesize='10' titlelen='40' orderby=field(article_orderby,sortrank) orderway=field(article_orderway,desc)}
步骤 3:修改 arc.listview.class.php 以支持自定义字段
这是最关键的一步,让织梦能识别我们通过模板传过来的自定义字段。
-
找到文件:
/include/arc.listview.class.php -
修改
ParseDMFields函数: 在这个函数中,找到处理orderby参数的代码段,通常是一个switch语句。找到类似这样的代码:
switch($this->orderby) { case 'hot': $ordersql = ' ORDER BY click DESC'; break; case 'click': $ordersql = ' ORDER BY click DESC'; break; // ... 其他 case default: $ordersql = ' ORDER BY sortrank DESC'; } -
添加新的 case: 在
switch语句中,添加一个新的case来处理我们自定义的字段,这个case的核心是动态构建SQL。修改为:
switch($this->orderby) { case 'hot': $ordersql = ' ORDER BY click DESC'; break; case 'click': $ordersql = ' ORDER BY click DESC'; break; // ... 其他默认的 case // 新增的代码块,用于处理自定义字段 default: // 检查 $this->orderby 的值是否是数据库中有效的字段名 // 为了安全,最好只允许特定的几个字段 $allow_orderby_fields = array('sortrank', 'pubdate', 'click', 'title', 'id', 'arcrank'); if (in_array($this->orderby, $allow_orderby_fields)) { // 获取排序方向,默认为降序 $orderway = isset($this->orderway) && strtolower($this->orderway) == 'asc' ? 'ASC' : 'DESC'; $ordersql = " ORDER BY {$this->orderby} {$orderway}"; } else { // 如果不是允许的字段,则使用默认排序 $ordersql = ' ORDER BY sortrank DESC'; } break; }这段代码的逻辑是:
orderby的值在我们允许的字段列表中,就动态拼接出ORDER BY field_name ASC/DESC这样的SQL语句,如果不是,则回退到默认的安全排序。
步骤 4:清理缓存
同样,登录后台,“系统” -> “一键更新网站” -> “更新系统缓存”。
总结方法二:
- 优点:
- 非常灵活:每个栏目都可以独立设置排序方式。
- 安全可靠:不直接修改核心排序逻辑,而是通过扩展实现。
- 易于维护:升级织梦时,只要不覆盖自定义字段和模板修改,功能依然存在。
- 缺点:
步骤稍多,需要理解织梦的字段和模板机制。
最终建议
对于大多数用户,强烈推荐使用方法二,它虽然步骤多一些,但带来的灵活性和可维护性是方法一无法比拟的,它完美地体现了“配置优于硬编码”的原则,让网站管理更加方便。
如果你只是想在所有列表页都使用一种固定的、非默认的排序方式(比如都按点击量排序),那么方法一更简单快捷。
