场景说明
假设你的网站结构如下:

首页
├─ 新闻中心 (栏目ID=1, 类型=栏目)
│ ├─ 公司新闻 (栏目ID=3, 类型=栏目)
│ └─ 行业动态 (栏目ID=4, 类型=栏目)
└─ 产品展示 (栏目ID=2, 类型=栏目)
├─ 产品分类A (栏目ID=5, 类型=栏目)
└─ 产品分类B (栏目ID=6, 类型=栏目)
当你访问 新闻中心 的列表页 (list_1.php) 时,你希望调用出它的子栏目:公司新闻 和 行业动态。
最常用和推荐的方法 - 使用 channel
这是最直接、最简单的方法,专门用于获取当前栏目的子栏目,它默认会调用顶级栏目和当前栏目的下一级子栏目。
基本语法
{dede:channel type='son' currentstyle="<li><a href='~typelink~' class='thisclass'>~typename~</a></li>"}
<li><a href='[field:typelink/]'>[field:typename/]</a></li>
{/dede:channel}
参数详解
type='son': 核心参数,表示只调用当前栏目的直接子栏目。
currentstyle: 非常实用的参数,它会给当前正在访问的子栏目(即列表页面对应的栏目)应用一个特殊的样式,你正在看“公司新闻”列表页,currentstyle 里的内容就会渲染给“公司新闻”这个栏目链接。
~typelink~: currentstyle 中的特殊变量,会被替换为栏目的链接地址。
~typename~: currentstyle 中的特殊变量,会被替换为栏目的名称。
[field:typelink/]: 子栏目的链接地址。
[field:typename/]: 子栏目的名称。
完整示例(带CSS高亮)
假设你的列表页模板文件是 list_article.htm。
<!-- 在列表页的适当位置,比如标题下方,放置子栏目导航 -->
<div class="subnav">
<h3>栏目导航</h3>
<ul>
{dede:channel type='son' currentstyle="<li class='active'><a href='~typelink~' class='thisclass'>~typename~</a></li>"}
<li><a href='[field:typelink/]'>[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
效果解释:
(图片来源网络,侵删)
- 当你访问
list_1.php (新闻中心) 时,如果新闻中心没有开启“使用列表”,这个标签可能不会显示任何内容,因为 type='son' 要求父栏目本身也必须是“栏目”类型,并且有子栏目。
- 当你访问
list_3.php (公司新闻) 时,ul 内的HTML会变成:<ul>
<li class="active"><a href='/plus/list.php?tid=3' class='thisclass'>公司新闻</a></li>
<li><a href='/plus/list.php?tid=4'>行业动态</a></li>
</ul>
你可以通过CSS的 .thisclass 或 .active 类来为当前栏目链接设置高亮样式,比如改变颜色或加粗。
更灵活的方法 - 使用 arclist
arclist 是万能的列表标签,也可以用来调用子栏目,它的好处是功能更强大,可以结合其他属性使用,limit (限制数量)、orderby (排序方式) 等。
基本语法
{dede:arclist typeid='son' channelid='1' row='10' titlelen='30'}
<a href="[field:arcurl/]">[field:title/]</a>
{/dede:arclist}
注意: 这种方法调用的是子栏目下的文章,而不是子栏目本身,如果你只是想显示一个栏目导航列表,不推荐此方法,但如果你想在父栏目列表页同时显示子栏目的最新文章,这个方法就非常有用。
参数详解
typeid='son': 核心参数,表示获取当前栏目的子栏目ID作为文章查询的范围。
channelid='1': 指定要查询的模型ID,对于栏目,通常需要指定为栏目模型的ID,但更常见的是用它来限制文章的频道,如果目标是获取栏目信息,这个标签用起来不太直观。
row='10': 显示10条记录。
[field:arcurl/]: 文章的链接地址。
[field:title/]: 文章的标题。
重要提示: arclist 是用来调内容的,不是专门用来调栏目的,如果你只想显示“公司新闻”、“行业动态”这样的栏目名称和链接,强烈推荐使用方法一的 channel。aritelist 更适合“显示公司新闻栏目的最新5篇文章”这类需求。
获取所有顶级栏目(适用于首页)
如果你的需求是在首页调用所有一级栏目(如“新闻中心”、“产品展示”),而不是某个列表页的子栏目,那么应该使用 channel 标签的默认行为。
基本语法
{dede:channel type='top' currentstyle="<li class='thisclass'><a href='~typelink~'>~typename~</a></li>"}
<li><a href='[field:typelink/]'>[field:typename/]</a></li>
{/dede:channel}
type='top': 表示只调用顶级栏目,这个参数在列表页中是可选的,因为默认行为就是如此,但在首页必须明确指定。
总结与最佳实践
用途
推荐场景
优点
缺点
{dede:channel type='son'}
调用当前栏目的直接子栏目
列表页/频道页的子栏目导航
专用、简单、高效、支持currentstyle高亮
功能相对单一,只调用栏目
{dede:arclist typeid='son'}
调用子栏目下的文章内容
在父栏目列表页同时显示子栏目的最新文章
功能强大,可结合多种参数
不适合纯栏目导航,逻辑上容易混淆
{dede:channel type='top'}
调用所有顶级栏目
首页主导航
专用,调用顶级栏目清晰
不适用于子栏目调用
对于“在dede list调用子栏目”这个问题,方法一 {dede:channel type='son'} 是最标准、最推荐的解决方案,它代码简洁,意图明确,currentstyle 功能在实际开发中非常实用。
常见问题排查 (FAQ)
Q1: 为什么我用了 {dede:channel type='son'} 什么都没显示?
A1: 请检查以下几点:
- 父栏目设置:确保你所在的列表页面对应的父栏目,在后台“栏目管理”中,“栏目列表选项”里没有勾选“使用列表”,如果勾选了,DedeCMS 会认为这是一个内容列表页而不是一个栏目索引页,子栏目调用可能会失效。
- 子栏目是否存在:确认当前栏目下是否真的有子栏目,并且子栏目的“类型”是“栏目”而不是“外部链接”或“单页”。
- 栏目类型:确保父栏目本身是“栏目”类型。
Q2: 我想调用所有子栏目(包括孙栏目),怎么办?
A2: DedeCMS 的 channel 标签本身没有直接调用所有层级子栏目的参数,一个变通的方法是使用 son + self,但这依然有限,如果需要调用所有后代栏目,通常需要更复杂的处理,比如编写一个自定义函数或使用递归标签,这超出了基础标签的范畴,对于99%的网站,调用直接子栏目 (son) 已经足够。
这是最直接、最简单的方法,专门用于获取当前栏目的子栏目,它默认会调用顶级栏目和当前栏目的下一级子栏目。
基本语法
{dede:channel type='son' currentstyle="<li><a href='~typelink~' class='thisclass'>~typename~</a></li>"}
<li><a href='[field:typelink/]'>[field:typename/]</a></li>
{/dede:channel}
参数详解
type='son': 核心参数,表示只调用当前栏目的直接子栏目。currentstyle: 非常实用的参数,它会给当前正在访问的子栏目(即列表页面对应的栏目)应用一个特殊的样式,你正在看“公司新闻”列表页,currentstyle里的内容就会渲染给“公司新闻”这个栏目链接。~typelink~:currentstyle中的特殊变量,会被替换为栏目的链接地址。~typename~:currentstyle中的特殊变量,会被替换为栏目的名称。
[field:typelink/]: 子栏目的链接地址。[field:typename/]: 子栏目的名称。
完整示例(带CSS高亮)
假设你的列表页模板文件是 list_article.htm。
<!-- 在列表页的适当位置,比如标题下方,放置子栏目导航 -->
<div class="subnav">
<h3>栏目导航</h3>
<ul>
{dede:channel type='son' currentstyle="<li class='active'><a href='~typelink~' class='thisclass'>~typename~</a></li>"}
<li><a href='[field:typelink/]'>[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
效果解释:

- 当你访问
list_1.php(新闻中心) 时,如果新闻中心没有开启“使用列表”,这个标签可能不会显示任何内容,因为type='son'要求父栏目本身也必须是“栏目”类型,并且有子栏目。 - 当你访问
list_3.php(公司新闻) 时,ul内的HTML会变成:<ul> <li class="active"><a href='/plus/list.php?tid=3' class='thisclass'>公司新闻</a></li> <li><a href='/plus/list.php?tid=4'>行业动态</a></li> </ul>你可以通过CSS的
.thisclass或.active类来为当前栏目链接设置高亮样式,比如改变颜色或加粗。
更灵活的方法 - 使用 arclist
arclist 是万能的列表标签,也可以用来调用子栏目,它的好处是功能更强大,可以结合其他属性使用,limit (限制数量)、orderby (排序方式) 等。
基本语法
{dede:arclist typeid='son' channelid='1' row='10' titlelen='30'}
<a href="[field:arcurl/]">[field:title/]</a>
{/dede:arclist}
注意: 这种方法调用的是子栏目下的文章,而不是子栏目本身,如果你只是想显示一个栏目导航列表,不推荐此方法,但如果你想在父栏目列表页同时显示子栏目的最新文章,这个方法就非常有用。
参数详解
typeid='son': 核心参数,表示获取当前栏目的子栏目ID作为文章查询的范围。
channelid='1': 指定要查询的模型ID,对于栏目,通常需要指定为栏目模型的ID,但更常见的是用它来限制文章的频道,如果目标是获取栏目信息,这个标签用起来不太直观。
row='10': 显示10条记录。
[field:arcurl/]: 文章的链接地址。
[field:title/]: 文章的标题。
重要提示: arclist 是用来调内容的,不是专门用来调栏目的,如果你只想显示“公司新闻”、“行业动态”这样的栏目名称和链接,强烈推荐使用方法一的 channel。aritelist 更适合“显示公司新闻栏目的最新5篇文章”这类需求。
获取所有顶级栏目(适用于首页)
如果你的需求是在首页调用所有一级栏目(如“新闻中心”、“产品展示”),而不是某个列表页的子栏目,那么应该使用 channel 标签的默认行为。
基本语法
{dede:channel type='top' currentstyle="<li class='thisclass'><a href='~typelink~'>~typename~</a></li>"}
<li><a href='[field:typelink/]'>[field:typename/]</a></li>
{/dede:channel}
type='top': 表示只调用顶级栏目,这个参数在列表页中是可选的,因为默认行为就是如此,但在首页必须明确指定。
总结与最佳实践
用途
推荐场景
优点
缺点
{dede:channel type='son'}
调用当前栏目的直接子栏目
列表页/频道页的子栏目导航
专用、简单、高效、支持currentstyle高亮
功能相对单一,只调用栏目
{dede:arclist typeid='son'}
调用子栏目下的文章内容
在父栏目列表页同时显示子栏目的最新文章
功能强大,可结合多种参数
不适合纯栏目导航,逻辑上容易混淆
{dede:channel type='top'}
调用所有顶级栏目
首页主导航
专用,调用顶级栏目清晰
不适用于子栏目调用
对于“在dede list调用子栏目”这个问题,方法一 {dede:channel type='son'} 是最标准、最推荐的解决方案,它代码简洁,意图明确,currentstyle 功能在实际开发中非常实用。
常见问题排查 (FAQ)
Q1: 为什么我用了 {dede:channel type='son'} 什么都没显示?
A1: 请检查以下几点:
- 父栏目设置:确保你所在的列表页面对应的父栏目,在后台“栏目管理”中,“栏目列表选项”里没有勾选“使用列表”,如果勾选了,DedeCMS 会认为这是一个内容列表页而不是一个栏目索引页,子栏目调用可能会失效。
- 子栏目是否存在:确认当前栏目下是否真的有子栏目,并且子栏目的“类型”是“栏目”而不是“外部链接”或“单页”。
- 栏目类型:确保父栏目本身是“栏目”类型。
Q2: 我想调用所有子栏目(包括孙栏目),怎么办?
A2: DedeCMS 的 channel 标签本身没有直接调用所有层级子栏目的参数,一个变通的方法是使用 son + self,但这依然有限,如果需要调用所有后代栏目,通常需要更复杂的处理,比如编写一个自定义函数或使用递归标签,这超出了基础标签的范畴,对于99%的网站,调用直接子栏目 (son) 已经足够。
arclist 是万能的列表标签,也可以用来调用子栏目,它的好处是功能更强大,可以结合其他属性使用,limit (限制数量)、orderby (排序方式) 等。
基本语法
{dede:arclist typeid='son' channelid='1' row='10' titlelen='30'}
<a href="[field:arcurl/]">[field:title/]</a>
{/dede:arclist}
注意: 这种方法调用的是子栏目下的文章,而不是子栏目本身,如果你只是想显示一个栏目导航列表,不推荐此方法,但如果你想在父栏目列表页同时显示子栏目的最新文章,这个方法就非常有用。
参数详解
typeid='son': 核心参数,表示获取当前栏目的子栏目ID作为文章查询的范围。channelid='1': 指定要查询的模型ID,对于栏目,通常需要指定为栏目模型的ID,但更常见的是用它来限制文章的频道,如果目标是获取栏目信息,这个标签用起来不太直观。row='10': 显示10条记录。[field:arcurl/]: 文章的链接地址。[field:title/]: 文章的标题。
重要提示: arclist 是用来调内容的,不是专门用来调栏目的,如果你只想显示“公司新闻”、“行业动态”这样的栏目名称和链接,强烈推荐使用方法一的 channel。aritelist 更适合“显示公司新闻栏目的最新5篇文章”这类需求。
获取所有顶级栏目(适用于首页)
如果你的需求是在首页调用所有一级栏目(如“新闻中心”、“产品展示”),而不是某个列表页的子栏目,那么应该使用 channel 标签的默认行为。
基本语法
{dede:channel type='top' currentstyle="<li class='thisclass'><a href='~typelink~'>~typename~</a></li>"}
<li><a href='[field:typelink/]'>[field:typename/]</a></li>
{/dede:channel}
type='top': 表示只调用顶级栏目,这个参数在列表页中是可选的,因为默认行为就是如此,但在首页必须明确指定。
总结与最佳实践
| 用途 | 推荐场景 | 优点 | 缺点 | |
|---|---|---|---|---|
{dede:channel type='son'} |
调用当前栏目的直接子栏目 | 列表页/频道页的子栏目导航 | 专用、简单、高效、支持currentstyle高亮 |
功能相对单一,只调用栏目 |
{dede:arclist typeid='son'} |
调用子栏目下的文章内容 | 在父栏目列表页同时显示子栏目的最新文章 | 功能强大,可结合多种参数 | 不适合纯栏目导航,逻辑上容易混淆 |
{dede:channel type='top'} |
调用所有顶级栏目 | 首页主导航 | 专用,调用顶级栏目清晰 | 不适用于子栏目调用 |
对于“在dede list调用子栏目”这个问题,方法一 {dede:channel type='son'} 是最标准、最推荐的解决方案,它代码简洁,意图明确,currentstyle 功能在实际开发中非常实用。
常见问题排查 (FAQ)
Q1: 为什么我用了 {dede:channel type='son'} 什么都没显示?
A1: 请检查以下几点:
- 父栏目设置:确保你所在的列表页面对应的父栏目,在后台“栏目管理”中,“栏目列表选项”里没有勾选“使用列表”,如果勾选了,DedeCMS 会认为这是一个内容列表页而不是一个栏目索引页,子栏目调用可能会失效。
- 子栏目是否存在:确认当前栏目下是否真的有子栏目,并且子栏目的“类型”是“栏目”而不是“外部链接”或“单页”。
- 栏目类型:确保父栏目本身是“栏目”类型。
Q2: 我想调用所有子栏目(包括孙栏目),怎么办?
A2: DedeCMS 的 channel 标签本身没有直接调用所有层级子栏目的参数,一个变通的方法是使用 son + self,但这依然有限,如果需要调用所有后代栏目,通常需要更复杂的处理,比如编写一个自定义函数或使用递归标签,这超出了基础标签的范畴,对于99%的网站,调用直接子栏目 (son) 已经足够。
