dede channel 排序

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

channel 标签主要用于获取栏目的列表,它的排序功能非常灵活,可以通过不同的参数来实现多种排序方式。

dede channel 排序
(图片来源网络,侵删)

核心排序参数

channel 标签中,控制排序最主要的参数是 typeidreid,以及 sort 属性。


按栏目ID排序

这是最基本、最直接的排序方式,栏目在后台添加时的顺序决定了它们的 ID 顺序,ID 是递增的。

  • 标签语法:

    {dede:channel type='top' row='10' sort=''}
        <a href='[field:typeurl/]'>[field:typename/]</a>
    {/dede:channel}
  • 参数说明:

    dede channel 排序
    (图片来源网络,侵删)
    • typeid='0': typeid 是指定父栏目的 ID,当 typeid0 时,表示获取所有顶级栏目(一级栏目)。
    • sort='orderid': 这是关键参数,它指定了排序的依据字段。
      • sort='orderid' (默认值): 按照后台“栏目管理”中设置的 “排序” 字段进行升序排列,这是最常用、最推荐的方式,因为它允许你在后台手动调整栏目的显示顺序。
      • sort='id': 按照栏目的 ID 进行升序排列。
      • sort='typeid': 按照栏目的 ID 进行升序排列(typeid 就是栏目的 ID,所以和 sort='id' 效果一样)。
  • 示例:获取顶级栏目并按后台设置的顺序显示

    <!-- 获取前10个顶级栏目,并按后台的“排序”值从小到大排列 -->
    {dede:channel type='top' row='10' sort='orderid'}
        <li><a href="[field:typeurl/]" title="[field:typename/]">[field:typename/]</a></li>
    {/dede:channel}

按栏目层级关系排序

当你需要获取某个特定栏目的子栏目时,使用 reid 参数。

  • 标签语法:

    {dede:channel reid='父栏目ID' row='10' sort='orderid'}
        <a href='[field:typeurl/]'>[field:typename/]</a>
    {/dede:channel}
  • 参数说明:

    • reid='父栏目ID': 指定父栏目的 ID,channel 标签会获取该父栏目下的所有直接子栏目。
    • sort='orderid': 同样,使用 sort='orderid' 可以按后台设置的子栏目顺序进行排列。
  • 示例:获取 ID 为 5 的栏目的所有子栏目

    <!-- 假设“产品分类”栏目的ID是5,获取它的所有子栏目 -->
    {dede:channel reid='5' sort='orderid'}
        <a href="[field:typeurl/]" title="[field:typename/]">[field:typename/]</a>
    {/dede:channel}

常用排序方式总结与代码示例

下面是一个清晰的表格,总结了 channel 标签最常用的几种排序组合:

排序需求 标签写法 说明
获取顶级栏目 (一级栏目) {dede:channel type='top'} type='top'typeid='0' 的简写,专门用于获取顶级栏目。
获取顶级栏目并按后台顺序 {dede:channel type='top' sort='orderid'} 最常用,按后台“栏目管理”里设置的“排序”值升序排列。
获取顶级栏目并按ID排序 {dede:channel type='top' sort='id'} 按栏目ID从小到大排列。
获取子栏目 {dede:channel reid='10'} 获取 ID 为 10 的栏目的所有直接子栏目。
获取子栏目并按后台顺序 {dede:channel reid='10' sort='orderid'} 最常用,按后台设置的子栏目顺序排列。
获取指定栏目及其子栏目 {dede:channel typeid='10'} 获取 ID 为 10 的栏目本身,以及它的所有子栏目。

进阶:自定义排序(按字母、按发布时间等)

标准的 channel 标签不支持按字母、按发布时间等自定义字段排序,它的排序依据仅限于 id, typeid, orderid 这几个系统内置字段。

如果你需要更复杂的排序,通常有以下两种解决方案:

使用 SQL 查询标签 (dede:sql)

这是最灵活的方法,可以直接编写 SQL 语句来获取和排序数据。

示例:获取顶级栏目并按栏目名称的拼音首字母排序

{dede:sql sql="SELECT id,typename,typeurl FROM dede_arctype WHERE reid=0 ORDER BY typename ASC"}
    <a href='[field:typeurl/]'>[field:typename/]</a>
{/dede:sql}

代码解释:

  • sql="...": 这里是标准的 SQL 查询语句。
  • FROM dede_arctype: dede_arctype 是 DedeCMS 中存储栏目的数据表。
  • WHERE reid=0: 筛选出顶级栏目(reid 为 0)。
  • ORDER BY typename ASC: 核心排序部分,按 typename (栏目名称) 字段进行升序排列。ASC 是升序,DESC 是降序。

修改程序文件 (不推荐,升级会失效)

你可以修改 DedeCMS 的核心文件 /include/taglib/channel.lib.php,在其中修改排序逻辑,找到 $ordersql 的赋值部分,将其修改为 ORDER BY typename ASC

警告:这种方法会破坏程序的封装性,在 DedeCMS 升级后,你的修改会被覆盖,需要重新修改。仅适用于个人项目或不打算升级的网站


实际应用场景举例

制作网站主导航栏

导航栏的顺序通常是由网站管理员在后台手动固定的,因此最简单直接的方式就是使用 sort='orderid'

<!-- 网站主导航 -->
<nav>
    <ul>
        {dede:channel type='top' row='8' sort='orderid'}
            <li><a href="[field:typeurl/]" [field:typename function='(@me=="首页") ? "class='current'" : ""'/]>[field:typename/]</a></li>
        {/dede:channel}
    </ul>
</nav>

这里加入了一个简单的判断,让当前栏目的链接添加一个 current 类,方便样式控制。

制作侧边栏的分类列表

侧边栏的分类列表通常是某个父栏目的子栏目,并且希望按字母顺序排列,方便用户查找。

<!-- 侧边栏:产品分类(按字母排序) -->
<div class="sidebar-widget">
    <h3>产品分类</h3>
    <ul>
        {dede:sql sql="SELECT id,typename,typeurl FROM dede_arctype WHERE reid=15 ORDER BY typename ASC"}
            <li><a href="[field:typeurl/]" title="[field:typename/]">[field:typename/]</a></li>
        {/dede:sql}
    </ul>
</div>

假设“产品分类”栏目的 ID 是 15,这里直接用 SQL 查询来获取其子栏目并按名称排序。

需求 推荐方法 标签示例
常规栏目排序(按后台设置) channel + sort='orderid' {dede:channel type='top' sort='orderid'}
获取子栏目 channel + reid {dede:channel reid='5' sort='orderid'}
自定义排序(字母、时间等) sql {dede:sql sql="... ORDER BY typename ASC"}

对于绝大多数网站,使用 channel 标签配合 sort='orderid' 是最佳实践,因为它简单、高效且符合内容管理的常规逻辑,只有在遇到特殊排序需求时,才需要使用 sql 标签进行更灵活的控制。

-- 展开阅读全文 --
头像
phpstudy dede模版如何配置与使用?
« 上一篇 01-08
C语言实验指导参考答案是否完整准确?
下一篇 » 01-08
取消
微信二维码
支付宝二维码

目录[+]