使用 channelartlist 标签(推荐,最灵活)
这是最推荐的方法,因为它功能强大,可以轻松获取子栏目的各种信息,并且支持自定义样式。

(图片来源网络,侵删)
适用场景:在当前栏目页(如 list_article_articleid_1.html)或栏目封面页(如 category_1.html)中,显示其直接子栏目的列表。
核心代码
{dede:channelartlist typeid='top' currentstyle='active'}
{dede:type}
<h2><a href='[field:typeurl/]'>[field:typename/]</a></h2>
{/dede:type}
{dede:channel type='son' noself='yes'}
<li><a href='[field:typeurl/]'>[field:typename/]</a></li>
{/dede:channel}
{/dede:channelartlist}
代码详解
-
{dede:channelartlist ...}typeid='top': 这个参数是关键,它告诉系统从顶级栏目开始循环,即使你当前在二级栏目下,它也会从网站的顶级栏目开始查找。{dede:channelartlist}会循环每一个顶级栏目。currentstyle='active': 这个参数用于高亮显示当前所在的顶级栏目,你可以在{dede:type}标签内使用它,{dede:type currentstyle="<h2 class='current'><a href='[field:typeurl/]'>[field:typename/]</a></h2>"} <h2><a href='[field:typeurl/]'>[field:typename/]</a></h2> {/dede:type}这样,当前顶级栏目的
<h2>会自动加上class="current"。
-
{dede:type}
(图片来源网络,侵删)- 这个标签用于获取
channelartlist循环到的当前顶级栏目的信息。[field:typename/]就是这个顶级栏目的名称,[field:typeurl/]是它的链接。
- 这个标签用于获取
-
{dede:channel type='son' noself='yes'}- 这个标签嵌套在
{dede:type}内部,它的作用是获取当前顶级栏目的直接子栏目。 type='son': 指定获取子栏目。noself='yes': 表示不包含栏目本身,这是一个好习惯,可以避免不必要的麻烦。[field:typename/]和[field:typeurl/]: 在这个循环里,它们分别代表每个子栏目的名称和链接。
- 这个标签嵌套在
如何只获取当前栏目的子栏目?
如果你只想显示当前所在栏目的子栏目,而不是所有顶级栏目的子栏目,代码可以简化为:
{dede:channel type='son' typeid=''}
<li><a href='[field:typeurl/]'>[field:typename/]</a></li>
{/dede:channel}
typeid='': 当留空时,typeid会自动获取当前页面的栏目ID,type='son'就会查找这个ID栏目的所有子栏目,这是最简洁直接的写法。
使用 arclist 标签(简单,仅限名称和链接)
如果你只需要一个简单的子栏目列表,并且不关心栏目简介、图片等信息,arclist 也是一个非常简单快捷的选择。
适用场景:快速获取子栏目的名称和链接。

(图片来源网络,侵删)
核心代码
{dede:arclist row='10' typeid='son'}
<a href='[field:arcurl/]'>[field:title/]</a>
{/dede:arclist}
代码详解
typeid='son': 和channel标签一样,son表示获取当前栏目的子栏目。row='10': 限制输出的子栏目数量,例如只显示10个子栏目。[field:arcurl/]和[field:title/]: 在arclist中,arcurl代表栏目链接,title代表栏目名称。
使用 SQL 查询(最灵活,适合复杂逻辑)
如果你需要根据子栏目的某些特定字段(如排序、文章数等)进行排序,或者需要进行更复杂的判断,那么直接执行 SQL 查询是最佳选择。
适用场景:需要自定义排序、获取额外栏目字段(如 keywords)、或在 PHP 代码中处理子栏目数据。
核心代码
{dede:sql sql='SELECT * FROM `dede_arctype` WHERE reid=~id~ ORDER BY sortrank'}
<li><a href='[field:typedir function="MakeDir(@me)"/]'>[field:typename/]</a></li>
{/dede:sql}
代码详解
dede:sql: 自定义SQL查询标签。SELECT * FROM dede_arctype:dede_arctype是 DedeCMS 中存储栏目的数据表。WHERE reid=~id~: 这是查询的核心。reid字段代表“父栏目ID”。~id~是 DedeCMS 的一个特殊变量,会自动被替换为当前栏目的ID。- 所以这句代码的意思是:查找所有父栏目ID等于当前栏目ID的记录,也就是所有子栏目。
ORDER BY sortrank: 按照后台设置的“排序值”进行升序排列,你也可以改成ORDER BY id DESC按ID降序排列。[field:typedir function="MakeDir(@me)"/]: 获取栏目的目录路径,并用MakeDir函数处理,确保链接格式正确。[field:typename/]: 获取栏目名称。
总结与对比
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
channelartlist |
最灵活,功能强大,支持嵌套循环,可获取任意层级的栏目。 | 代码结构相对复杂一点。 | 通用场景,特别是需要制作多级导航栏时。 |
channel |
最简洁,专为栏目设计,代码易读。 | 功能相对单一,不如 channelartlist 灵活。 |
简单需求,只需要在当前栏目页显示其子栏目列表。 |
arclist |
代码非常简单。 | 仅能获取名称和链接,功能有限。 | 超简单的子栏目列表展示。 |
sql |
最灵活,完全控制查询逻辑,可做任何复杂排序和筛选。 | 需要懂 SQL 语法,有出错风险。 | 有特殊排序需求,或需要获取栏目特定字段时。 |
对于绝大多数情况,方法一(channelartlist) 和 方法一简化版(channel) 是你的首选,它们既安全又高效。
