使用 {dede:channel} 标签(最常用、最推荐)
这是最标准、最灵活的方法,通过设置 typeid 和 reid 参数来精确控制。

(图片来源网络,侵删)
调用所有顶级栏目
这是最常见的需求,比如在网站首页的顶部导航栏显示所有一级栏目。
代码:
{dede:channel type='top' row='8'}
<li><a href="[field:typeurl/]">[field:typename/]</a></li>
{/dede:channel}
代码解析:
{dede:channel}: 这是调用栏目的基本标签。type='top': 这是核心参数,表示只调用顶级栏目(一级栏目)。row='8': 表示调用的栏目数量,'8'是一个示例,你可以改成你需要的数字,如0表示调用所有。[field:typeurl/]: 输出栏目的链接地址。[field:typename/]: 输出栏目的名称。
示例效果: 假设你的顶级栏目有“首页”、“产品中心”、“新闻动态”、“关于我们”、“联系我们”,那么这段代码会输出:

(图片来源网络,侵删)
<li><a href="/product/">产品中心</a></li> <li><a href="/news/">新闻动态</a></li> <li><a href="/about/">关于我们</a></li> <li><a href="/contact/">联系我们</a></li>
(注意:首页通常不通过这个标签调用,而是直接写在HTML中)
调用指定顶级栏目及其子栏目
有时候我们需要显示某个一级栏目,并且同时显示它的所有直接子栏目(二级栏目),点击“产品中心”后,在左侧显示其所有产品分类。
代码:
{dede:channel type='son' typeid='2'}
<li><a href="[field:typeurl/]">[field:typename/]</a></li>
{/dede:channel}
代码解析:
type='son': 表示调用指定栏目的直接子栏目。typeid='2': 这是核心参数,'2'是你想要调用的那个顶级栏目本身的ID,你需要登录DedeCMS后台,在“栏目管理”中找到该栏目并查看其ID号。
示例效果:
如果栏目ID为 2 的顶级栏目是“产品中心”,它下面有三个子栏目“分类A”、“分类B”、“分类C”,那么这段代码会输出:
<li><a href="/product/a/">分类A</a></li> <li><a href="/product/b/">分类B</a></li> <li><a href="/product/c/">分类C</a></li>
使用 {dede:global} 标签(用于当前位置)
这种方法通常用在文章内容页或列表页,用来显示“首页 > 一级栏目 > 二级栏目”这样的面包屑导航。
代码:
{dede:field name='position'/}
代码解析:
- 这个标签会自动解析当前内容所在的栏目路径。
- 它会自动调用从顶级栏目到当前栏目的所有层级。
示例效果: 如果当前文章位于“新闻动态 > 公司新闻”下,那么它会输出:
<a href='/'><i class='fa fa-home'></i> 首页</a> > <a href='/news/'>新闻动态</a> > 公司新闻
从这个输出中,你可以清晰地看到“新闻动态”就是顶级栏目。
使用SQL直接查询(最灵活,适合复杂场景)
当你需要对栏目数据进行二次处理(比如按特定顺序排序、结合其他条件查询)时,可以直接使用SQL查询。
代码:
{dede:sql sql='SELECT id,typename,typedir FROM `dede_arctype` WHERE reid=0 AND ishidden<>1 ORDER BY id'}
<li><a href="[field:typedir function='str_replace("{cmspath}","",@me)'/]">[field:typename/]</a></li>
{/dede:sql}
代码解析:
{dede:sql}: 执行自定义SQL语句的标签。sql='...': 里面的SQL语句是关键。SELECT id,typename,typedir FROM dede_arctype: 从栏目表dede_arctype(你的表前缀可能是dede_或其他) 中选择ID、名称和目录路径。WHERE reid=0: 这是核心条件,reid字段表示“父栏目ID”,0就代表顶级栏目。AND ishidden<>1: 排除在后台设置为“隐藏”的栏目。ORDER BY id: 按栏目ID排序。
[field:typedir function='str_replace("{cmspath}","",@me)'/]: 因为typedir字段中可能包含系统变量{cmspath},需要用function函数将其替换掉,才能得到正确的URL。@me代表当前字段的原始值。str_replace是PHP的字符串替换函数。
总结与对比
| 方法 | 标签/代码 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 方法一 | {dede:channel type='top'} |
最推荐,代码简洁,官方标准,效率高 | 功能相对单一 | 大部分场景,如主导航、侧边栏一级分类。 |
| 方法一(变体) | {dede:channel type='son' typeid='x'} |
灵活,可以调用指定栏目的子栏目 | 需要知道父栏目的ID | 显示某个特定栏目下的子分类。 |
| 方法二 | {dede:field name='position'} |
自动获取路径,方便实现面包屑导航 | 无法独立调用顶级栏目列表 | 内容页或列表页的当前位置(面包屑)。 |
| 方法三 | {dede:sql ...} |
最灵活,可以结合任何SQL条件进行复杂查询 | 代码稍复杂,有一定SQL要求,效率略低于标签 | 需要特殊排序、特殊筛选或进行数据处理的复杂页面。 |
对于绝大多数日常开发需求,方法一 ({dede:channel type='top'}) 是您应该首先选择的方案,它简单、高效且易于维护。
