在 DedeCMS 中,调用子栏目主要通过模板文件中的 来实现,最核心的标签是 {dede:channel},根据不同的需求,这个标签有多种使用方式。

核心标签:{dede:channel}
{dede: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}
代码详解:

-
{dede:channel type='son' ...}:type='son':这是关键属性,表示“调用当前栏目的直接子栏目”,如果你想在首页调用所有顶级栏目,可以使用type='top'。
-
currentstyle="<li><a href='~typelink~' class='thisclass'>~typename~</a></li>":currentstyle:用于设置“当前栏目”的样式,当用户正在浏览某个子栏目时,这个子栏目会应用currentstyle中定义的HTML结构。~typelink~和~typename~是currentstyle中的特殊变量,分别代表子栏目的链接和名称。class='thisclass':你可以自定义一个CSS类名,用来给当前栏目添加高亮样式。
-
<li><a href="[field:typelink/]">[field:typename/]</a></li>:- 这是默认的循环体模板,用于显示非当前状态的子栏目。
[field:typelink/]:子栏目的链接地址。[field:typename/]:子栏目的名称。
调用指定栏目的子栏目
有时你可能想在某个页面调用一个特定父栏目的子栏目,而不是当前栏目的子栏目。

代码示例:
{dede:channel typeid='2' type='son'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
代码详解:
typeid='2':- 这个属性指定了要调用的父栏目的 ID,上面的代码会调用栏目ID为2的所有直接子栏目。
- 你需要先在 DedeCMS 后台的【栏目管理】中找到你想要调用的父栏目,并记下其ID。
调用当前栏目的所有后代栏目(包括子栏目、孙栏目等)
如果你需要展示一个层级的所有栏目,而不是只有一级子栏目。
代码示例:
<ul>
{dede:channel type='sun' currentstyle="<li><a href='~typelink~' class='thisclass'>~typename~</a></li>"}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
代码详解:
type='sun':sun表示调用“子孙栏目”,即当前栏目下的所有层级的子栏目。
注意: 这种调用方式返回的是一个扁平化的列表,不会自动生成层级缩进,如果需要显示层级关系,需要配合 reid(父栏目ID)等字段在CSS中自己控制样式,或者使用更复杂的嵌套循环。
调用顶级栏目
通常用于网站主导航或者页脚的友情链接区域。
代码示例:
{dede:channel type='top'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
代码详解:
type='top':top表示调用所有顶级栏目(即没有父栏目的栏目)。
高级用法与技巧
控制栏目数量
使用 row 属性来限制显示的栏目数量。
{dede:channel type='son' row='5'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
row='5':只显示5个子栏目。
排除某个栏目
使用 notypeid 属性来排除不需要显示的栏目。
{dede:channel type='son' notypeid='10,12'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
notypeid='10,12':不显示ID为10和12的子栏目。
调用子栏目的文章数量
如果想在显示子栏目名称的同时,也显示该栏目下的文章数量,可以使用 arclen 属性(注意:此属性在旧版本中可能需要开启或使用其他方法)。
一个更通用的方法是利用 {dede:field} 标签获取当前栏目的文章数,但这不适用于循环,对于循环中的子栏目文章数,一个简单的方法是调用 getarccount 函数。
{dede:channel type='son'}
<li>
<a href="[field:typelink/]">[field:typename/]</a>
<span>([field:ID function="GetArcCount(@me)"/])</span>
</li>
{/dede:channel}
代码详解:
[field:ID function="GetArcCount(@me)"/]:[field:ID]获取当前子栏目的ID。function="GetArcCount(@me)"调用 DedeCMS 的GetArcCount函数,并将子栏目ID作为参数传入,从而获取该栏目下的文章数量。- 注意:
GetArcCount函数会增加数据库查询次数,如果子栏目很多,可能会对网站性能产生轻微影响。
调用指定层级的栏目
如果你只想调用某个特定层级的栏目(只调用三级栏目),可以使用 channel 标签的 native 和 level 属性组合,但这比较复杂,一个更简单的方法是先获取父栏目ID,然后调用其子栏目。
总结与文件位置
| 需求 | 核心标签 | 关键属性 |
|---|---|---|
| 调用当前栏目的直接子栏目 | {dede:channel} |
type='son' |
| 调用指定栏目的子栏目 | {dede:channel} |
typeid='父栏目ID' |
| 调用当前栏目的所有子孙栏目 | {dede:channel} |
type='sun' |
| 调用所有顶级栏目 | {dede:channel} |
type='top' |
模板文件存放位置:
这些标签代码通常写在 DedeCMS 的模板文件中,路径为:
/templets/你的模板文件夹名/
- 首页模板:
/templets/default/index.htm - 列表页模板:
/templets/default/list_article.htm - 文章页模板:
/templets/default/article_article.htm - 其他自定义页面模板:
/templets/default/xxx.htm
你只需要用文本编辑器(如 Dreamweaver、VS Code、Notepad++ 等)打开对应的模板文件,在需要显示子栏目的位置粘贴上述代码即可,修改完成后,记得在后台【生成】->【更新HTML】来更新页面。
