使用 {dede:channel} 标签(最常用、最推荐)
这是最标准、最灵活的方法,不仅可以调用子栏目名称,还可以调用链接、ID等其他信息。

(图片来源网络,侵删)
调用指定父栏目下的所有直接子栏目
假设你的父栏目ID是 5,你想要在ID为5的栏目页里,调用它的所有直接子栏目。
代码示例:
{dede:channel type='son' typeid='5'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
代码详解:
{dede:channel}:这是调用栏目的核心标签。type='son':这是关键参数,表示调用“子栏目”,它只会调用当前栏目(或指定栏目)的下一级直接子栏目,不会调用孙栏目。typeid='5':指定要查询的父栏目ID,如果你把这个标签直接放在一个栏目模板(article_*.htm)里,并且省略typeid属性,typeid会自动默认为当前栏目的ID,这就是为什么在栏目页调用自己的子栏目时,通常可以省略typeid。[field:typelink/]:子栏目的链接地址。[field:typename/]:子栏目的名称。
完整示例(在父栏目列表页中使用):

(图片来源网络,侵删)
假设父栏目是“产品分类”(ID=5),其下有“手机”、“电脑”、“平板”三个子栏目。
<h2>产品分类</h2>
<ul>
{dede:channel type='son' typeid='5'}
<li>
<a href="[field:typelink/]" title="[field:typename/]">[field:typename/]</a>
</li>
{/dede:channel}
</ul>
最终生成的HTML效果:
<h2>产品分类</h2>
<ul>
<li><a href="/plus/list.php?tid=6" title="手机">手机</a></li>
<li><a href="/plus/list.php?tid=7" title="电脑">电脑</a></li>
<li><a href="/plus/list.php?tid=8" title="平板">平板</a></li>
</ul>
调用所有下级栏目(包括孙栏目)
如果你需要调用一个父栏目下的所有层级的子栏目(不仅包括直接子栏目,还包括孙栏目、曾孙栏目等),可以使用 type='self' 配合 reid 属性。
代码示例:

(图片来源网络,侵删)
假设父栏目ID是 5。
{dede:channel type='self' reid='5'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
代码详解:
type='self':表示调用“自身以及所有下级栏目”。reid='5':指定顶级父栏目的ID。type='self'必须与reid配合使用,才能实现调用所有下级栏目的目的。
使用 {dede:global} 标签(在顶级栏目页调用)
这个方法比较特殊,只在一种情况下适用:当你的栏目是顶级栏目,并且你希望调用它的一级子栏目时。
代码示例:
{dede:channel type='son' typeid=''}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
代码详解:
typeid='':将typeid设为空字符串,在顶级栏目模板中,{dede:channel}会自动识别当前顶级栏目的ID,并调用它的子栏目。- 注意:此方法不适用于二级或更深层级的栏目页,在二级栏目页,
typeid为空时会调用当前栏目的子栏目(即三级栏目),而不是上级的子栏目。方法一(指定typeid)是更通用、更推荐的做法。
使用SQL直接查询(最灵活,适合复杂逻辑)
当 {dede:channel} 标签无法满足你的复杂需求时(需要根据特定条件筛选子栏目),你可以使用 dede:sql 标签直接执行SQL查询。
代码示例:
同样,调用父栏目ID为 5 的所有直接子栏目。
{dede:sql sql='SELECT id,typename,typedir FROM `dede_arctype` WHERE reid = 5 ORDER BY id'}
<a href="[field:typedir function='MakeDir(@me)'/]">[field:typename/]</a>
{/dede:sql}
代码详解:
dede:sql:执行自定义SQL语句的标签。sql='...':里面的SQL语句。dede_arctype:DedeCMS中存储栏目的表名(如果你的表前缀不是dede_,请修改)。WHERE reid = 5:reid字段存储的是栏目的“父栏目ID”,这句就是筛选出父ID为5的栏目。ORDER BY id:按栏目ID排序,你可以根据需要改为sortrank等。
[field:typedir function='MakeDir(@me)'/]:typedir字段存储的是栏目目录,但它可能包含{cmspath}这样的变量,需要用MakeDir函数处理才能生成正确的URL,这比{dede:channel}中的typelink稍微复杂一点。[field:typename/]:直接输出栏目名称。
总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
{dede:channel} |
官方标准,简单易用,功能强大,支持所有常用参数。 | 对于极特殊需求可能不够灵活。 | 90%以上的场景,是首选方法。 |
{dede:global} |
代码简洁。 | 适用范围窄,仅限顶级栏目。 | 快速在顶级栏目页调用其子栏目。 |
{dede:sql} |
极度灵活,可以任意组合查询条件。 | 代码相对复杂,需要了解SQL和表结构,有安全风险(需注意防注入)。 | 需要根据自定义字段、复杂排序等条件调用栏目时。 |
常见问题排查 (FAQ)
Q: 为什么我调用出来的子栏目是空的? A: 请检查以下几点:
typeid是否正确:确认你指定的父栏目ID是否存在。- 该栏目是否真的有子栏目:去后台检查一下。
type参数是否正确:确保使用了type='son'来调用直接子栏目。- 模板缓存:有时候旧模板缓存会导致问题,去后台“系统” -> “一键更新网站” -> “更新HTML” -> “更新栏目HTML”,并选择“更新所有”。
Q: 我想调用当前栏目的子栏目,代码怎么写?
A: 最简单的方式就是省略 typeid,假设这个代码放在 article_5.htm(即ID为5的栏目模板)中:
{dede:channel type='son'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
typeid 会自动使用当前模板对应的栏目ID 5。
希望这些详细的解释和示例能帮助你成功调用子栏目名称!
