织梦 文章排序自定义

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

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

织梦 文章排序自定义
(图片来源网络,侵删)
  1. 简单方法:修改系统文件 - 适合对代码有一定了解,且希望修改后所有地方都生效的用户。
  2. 推荐方法:使用自定义字段 + SQL修改 - 这是最灵活、最推荐的方法,不破坏核心文件,且可以针对不同栏目设置不同的排序方式。

下面我将详细讲解这两种方法。


修改系统文件(直接修改排序选项)

这种方法会直接修改织梦的核心文件,添加一个新的排序选项,按自定义排序”。

步骤 1:修改 arc.listview.class.php 文件

这个文件负责处理列表页的排序逻辑。

  1. 找到文件/include/arc.listview.class.php

    织梦 文章排序自定义
    (图片来源网络,侵删)
  2. 修改代码: 在这个文件中,找到 function __construct 构造函数,里面有一大段关于 $this->orders 的数组定义,我们需要在这个数组里添加我们自己的排序方式。

    找到类似这样的代码(版本不同,代码行数可能略有差异):

    // 对排序进行初始化
    $orders = array(
        'hot' => 'hot',
        'click' => 'click',
        'pubdate' => 'pubdate DESC',
        'lastpost' => 'lastpost',
        'score' => 'score',
    );
  3. 添加自定义排序: 在 $orders 数组中,添加一个新的键值对,我们添加一个名为 sortrank 的排序方式,它对应数据库中的 sortrank 字段(织梦默认有这个字段,用于控制后台的“排序”权重)。

    $orders = array(
        'sortrank' => 'sortrank', // 新增这一行
        'hot' => 'hot',
        'click' => 'click',
        'pubdate' => 'pubdate DESC',
        'lastpost' => 'lastpost',
        'score' => 'score',
    );

步骤 2:修改模板文件 list_article.htm

我们需要在前端模板中,让用户可以选择这个新的排序方式。

织梦 文章排序自定义
(图片来源网络,侵删)
  1. 找到文件/templets/default/list_article.htm (或者你当前使用模板目录下的文件)

  2. 修改排序下拉框: 找到包含排序选项的 <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>
  3. 添加新选项: 注意,这里的 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:在栏目中添加自定义字段

我们要让栏目管理员可以选择排序的字段。

  1. 进入栏目管理: 登录织梦后台,点击 “核心” -> “频道模型” -> “内容模型管理”

  2. 修改文章模型: 找到并点击 “普通文章” 模型,进入编辑页面。

  3. 添加字段: 在字段列表下方,点击 “添加新字段”

    • 字段名article_orderby (建议用英文,不能和已有字段重复)
    • 字段类型下拉菜单
    • 字段说明文章排序方式
    • 默认值sortrank (可以设置一个默认值)
    • 选项(一行一个)
      按排序权重|sortrank
      按发布时间|pubdate
      按点击数|click
      按标题|title
      按ID|id

      (你可以根据需要添加更多选项)

  4. 生成栏目: 添加完字段后,点击左下角的 “生成栏目HTML”,让新字段在后台生效。

  5. 为栏目设置值: 进入 “栏目管理”,编辑你想要应用自定义排序的栏目,在“常规选项”或“高级选项”中,你刚才添加的 “文章排序方式” 字段就会出现,为你需要的栏目选择一个默认的排序方式。

步骤 2:修改列表页模板文件 list_article.htm

我们需要修改模板,让它从当前栏目的自定义字段中读取排序方式。

  1. 找到文件/templets/default/list_article.htm

  2. 修改排序逻辑: 找到 {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 以支持自定义字段

这是最关键的一步,让织梦能识别我们通过模板传过来的自定义字段。

  1. 找到文件/include/arc.listview.class.php

  2. 修改 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';
    }
  3. 添加新的 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:清理缓存

同样,登录后台,“系统” -> “一键更新网站” -> “更新系统缓存”

总结方法二

  • 优点
    • 非常灵活:每个栏目都可以独立设置排序方式。
    • 安全可靠:不直接修改核心排序逻辑,而是通过扩展实现。
    • 易于维护:升级织梦时,只要不覆盖自定义字段和模板修改,功能依然存在。
  • 缺点

    步骤稍多,需要理解织梦的字段和模板机制。

最终建议

对于大多数用户,强烈推荐使用方法二,它虽然步骤多一些,但带来的灵活性和可维护性是方法一无法比拟的,它完美地体现了“配置优于硬编码”的原则,让网站管理更加方便。

如果你只是想在所有列表页都使用一种固定的、非默认的排序方式(比如都按点击量排序),那么方法一更简单快捷。

-- 展开阅读全文 --
头像
页分页插件如何安装使用?
« 上一篇 今天
织梦远程服务器错误如何排查解决?
下一篇 » 今天

相关文章

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

目录[+]