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

核心排序参数
channel 标签中,控制排序最主要的参数是 typeid 和 reid,以及 sort 属性。
按栏目ID排序
这是最基本、最直接的排序方式,栏目在后台添加时的顺序决定了它们的 ID 顺序,ID 是递增的。
-
标签语法:
{dede:channel type='top' row='10' sort=''} <a href='[field:typeurl/]'>[field:typename/]</a> {/dede:channel} -
参数说明:
(图片来源网络,侵删)typeid='0':typeid是指定父栏目的 ID,当typeid为0时,表示获取所有顶级栏目(一级栏目)。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
|
对于绝大多数网站,使用 channel 标签配合 sort='orderid' 是最佳实践,因为它简单、高效且符合内容管理的常规逻辑,只有在遇到特殊排序需求时,才需要使用 sql 标签进行更灵活的控制。
