核心原理
DedeCMS 调用栏目的核心是使用 {dede:channel} 标签,这个标签非常强大,通过不同的属性可以实现各种调用需求。

- 顶级栏目调用:
typeid='0' - 指定栏目调用:
typeid='栏目ID' - 下级栏目调用:
reid='父栏目ID' - 排除某个栏目:
notypeid='要排除的栏目ID' - 控制显示数量:
row='数量' - 控制是否显示栏目名称:
type='son'(仅显示子栏目),type='self'(仅显示自身),type='top'(仅显示顶级栏目)
只调用一级栏目(最常用)
这是最基础的需求,通常用于网站的顶部主导航。
适用场景: 网站主菜单、页脚链接等。
代码示例:
{dede:channel type='top' row='8'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
代码解析:

{dede:channel type='top' ...}:type='top'是关键,它告诉 DedeCMS 只调用顶级栏目。row='8': 可选,表示只调用前 8 个一级栏目。[field:typelink/]: 输出栏目的链接地址。[field:typename/]: 输出栏目的名称。
调用一级栏目及其对应的二级栏目
这是最常见的导航栏实现方式,鼠标悬停在一级栏目上时,显示其下的所有二级栏目。
适用场景: 下拉式主导航。
实现思路: 使用 {dede:channel} 调用一级栏目,然后在一级栏目循环的内部,再嵌套一个 {dede:channel} 调用其子栏目。
代码示例:

{dede:channel type='top' row='8'}
<li class="nav-item">
<a href="[field:typelink/]">[field:typename/]</a>
<ul class="sub-nav">
{dede:channel type='son' typeid='[field:id]'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</li>
{/dede:channel}
代码解析:
-
外层循环 (一级栏目):
{dede:channel type='top' ...}: 循环输出所有顶级栏目。[field:id]: 在循环中,[field:id]代表当前一级栏目的 ID。
-
内层循环 (二级栏目):
{dede:channel type='son' typeid='[field:id]'}: 这是关键。type='son': 表示只调用子栏目。typeid='[field:id]': 指定要查询的父栏目ID,这个ID就是外层循环中当前一级栏目的ID,这样就能准确找到每个一级栏目下的二级栏目了。
调用一级、二级、三级栏目(完整三级结构)
这个稍微复杂一些,通常用于网站的左侧分类导航或者复杂的面包屑导航。
适用场景: 电商网站的商品分类、多级内容管理系统。
实现思路: 在场景二的基础上,再增加一层嵌套循环,用于调用三级栏目。
代码示例:
<div class="category-nav">
{dede:channel type='top' row='10'}
<div class="category-item">
<h3><a href="[field:typelink/]">[field:typename/]</a></h3>
<div class="category-children">
{dede:channel type='son' typeid='[field:id]'}
<dl>
<dt><a href="[field:typelink/]">[field:typename/]</a></dt>
<dd>
{dede:channel type='son' typeid='[field:id]'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
</dd>
</dl>
{/dede:channel}
</div>
</div>
{/dede:channel}
</div>
代码解析:
- 第一层 (一级栏目):
type='top',typeid不需要,因为它本身就是顶级。 - 第二层 (二级栏目):
type='son',typeid='[field:id]'(一级栏目的ID)。 - 第三层 (三级栏目):
type='son',typeid='[field:id]'(二级栏目的ID),这里的[field:id]指的是当前二级栏目的ID,从而找到它的所有子栏目(即三级栏目)。
调用指定一级栏目下的所有子栏目(不限层级)
有时候你可能只想显示某一个特定栏目下的所有内容,产品中心”下的所有分类,不管它是二级还是三级。
适用场景: 单独的产品分类页、帮助中心等。
实现思路: 使用 reid 属性,它表示查询所有 reid 指定ID的子栏目,并且会递归查找所有层级的子栏目。
代码示例:
假设“产品中心”这个一级栏目的 ID 是 2。
<h2>产品中心</h2>
<ul>
{dede:channel reid='2'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
代码解析:
{dede:channel reid='2'}:reid='2'表示调用所有父栏目ID为2的子栏目,并且会无限级向下查找,所以它会输出ID为2的栏目的所有二级、三级、四级...栏目。- 这种方式非常方便,但要注意,如果栏目层级非常深,可能会生成很长的列表。
高级技巧与注意事项
-
当前栏目高亮 为了让用户知道自己在哪个栏目下,通常需要给当前栏目的链接添加一个高亮样式(
class="current")。 这需要结合{dede:field}标签和判断语句来实现,通常在模板文件里配合PHP代码使用。示例 (在列表页模板
list_article.htm中):{dede:channel type='top' row='8'} <li> <a href="[field:typelink/]" {dede:field name='typeid' runphp='yes'} @me = (@me == '当前栏目ID') ? 'class="current"' : ''; {/dede:field}> [field:typename/] </a> </li> {/dede:channel}注意:
'当前栏目ID'需要替换成实际的数字,或者使用更灵活的PHP代码来动态获取。 -
栏目为空时隐藏 如果一个一级栏目下没有任何子栏目(文章或子分类),你可能希望在下拉菜单中不显示它。 这可以通过自定义函数或修改DedeCMS核心文件来实现,比较复杂,一个简单的方法是在后台管理栏目时,确保没有内容的栏目不要设置为“在导航栏显示”。
-
栏目图片 如果你的栏目设置了图片,可以通过
[field:typedir/]获取目录,或者直接使用[field:image/](如果后台有此字段)来调用。示例 (调用栏目图片):
{dede:channel type='top' row='8'} <a href="[field:typelink/]"> <img src="[field:image/]" alt="[field:typename/]"> <span>[field:typename/]</span> </a> {/dede:channel}注意:
[field:image/]字段需要在后台“栏目管理” -> “增加一个顶级栏目”时,在“栏目图片”选项中上传。
| 调用需求 | 核心标签代码 | 关键属性 |
|---|---|---|
| 调用一级栏目 | {dede:channel type='top'} |
type='top' |
| 调用一级及二级 | 外层 {dede:channel type='top'} 内层 {dede:channel type='son' typeid='[field:id]'} |
内层 typeid 为外层 [field:id] |
| 调用多级栏目 | 嵌套使用 {dede:channel type='son' typeid='[field:id]'} |
逐层传递 [field:id] |
| 调用指定栏目的所有子栏目 | {dede:channel reid='栏目ID'} |
reid 属性 |
希望这份详细的指南能帮助您在 DedeCMS 项目中灵活地调用各级栏目!
