核心标签解析
在开始之前,我们先理解两个核心标签:

(图片来源网络,侵删)
-
{dede:channel}:用于获取栏目列表。typeid='top':获取顶级栏目(一级栏目)。typeid='当前栏目ID':获取指定栏目下的子栏目(二级栏目)。reid='0':与typeid='top'效果相同,获取顶级栏目。typeid='父栏目ID':获取指定父栏目下的子栏目。row='数字':获取的栏目数量。col='数字':每行显示的栏目数量。currentstyle='':当前栏目所在层级的样式模板。
-
{dede:field}:用于获取当前文档或栏目的字段信息。{dede:field.name/}:获取当前栏目的名称。{dede:field.id/}:获取当前栏目的ID。{dede:field.typename/}:获取当前栏目的别名(与 name 类似,但更推荐用 name)。
固定父栏目下的二级栏目(最常用)
如果你想在某个固定的父栏目(新闻中心”,ID为 2)下循环显示它的所有二级栏目,这是最直接的方法。
适用场景:网站侧边栏、页脚的特定栏目区块等。

(图片来源网络,侵删)
代码示例:
<h3>新闻中心</h3>
<ul>
{dede:channel typeid='2' row='10' currentstyle="<li><a href='~typelink~' class='thisclass'>~typename~</a></li>"}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
代码解释:
typeid='2':这是最关键的部分,这里的2是“新闻中心”这个一级栏目的 ID,你需要将其替换为你自己的父栏目ID。row='10':表示最多调用10个子栏目。currentstyle='...':定义了如果访问者正在浏览这个二级栏目,它应该显示的样式。~typelink~会被替换为栏目链接,~typename~会被替换为栏目名。[field:typelink/]:输出二级栏目的链接地址。[field:typename/]:输出二级栏目的名称。
循环所有一级栏目及其对应的二级栏目(推荐)
这是最经典和最常用的布局方式,常见于网站的主导航下方或首页的主要内容区,它会先循环所有一级栏目,然后在每个一级栏目下再循环出它的子栏目。
适用场景:首页主要内容区,展示整个网站的栏目结构。

(图片来源网络,侵删)
代码示例:
{dede:channel type='top' row='8'}
<div class="main-category">
<h2><a href="[field:typelink/]">[field:typename/]</a></h2>
<div class="sub-category">
<ul>
{dede:channel typeid='[field:id]' row='10'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
</div>
{/dede:channel}
代码解释:
-
外层循环
{dede:channel type='top' row='8'}:type='top':表示获取所有顶级栏目(一级栏目)。typeid='top'也可以达到同样效果。row='8':假设网站有8个一级栏目。- 这个循环会为每一个一级栏目生成一个
<div class="main-category">块。
-
内层循环
{dede:channel typeid='[field:id]' row='10'}:typeid='[field:id]':这是实现嵌套的核心。[field:id]是 DedeCMS 的一个特殊用法,它会动态获取外层循环中当前栏目的ID。- 当外层循环到“产品展示”(假设ID为3)时,内层的
typeid就会变成typeid='3',从而调用出“产品展示”下的所有二级栏目。 - 这个循环会在每个一级栏目块内,生成一个包含其所有子栏目的列表。
调用当前一级栏目下的所有二级栏目
这个方法非常有用,当你进入任何一个一级栏目页面时,自动显示它下面的所有二级栏目,方便用户导航。
适用场景:一级栏目列表页 (list_article_*.htm) 的内容区域。
代码示例:
在 list_article.htm 模板文件中,你可以这样写:
<h2>{dede:field.name/}</h2>
<p>这里是 {dede:field.name/} 的简介...</p>
<div class="sub-nav">
<h3>下属栏目:</h3>
<ul>
{dede:channel typeid='~id~' row='20'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
<!-- 这里再调用该栏目下的文章列表 -->
{dede:list pagesize='10'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:list}
代码解释:
{dede:field.name/}:获取当前一级栏目的名称,用作标题。{dede:channel typeid='~id~' row='20'}:typeid='~id~':这是另一个动态获取ID的语法,在栏目列表页模板中,~id~会自动解析为当前正在访问的这个一级栏目的ID,这比[field:id]在此场景下更明确。- 这个标签会自动调用当前栏目ID下的所有子栏目(即二级栏目)。
总结与注意事项
| 方法 | 核心代码 | 适用场景 | 关键点 |
|---|---|---|---|
| 方法一 | {dede:channel typeid='父栏目ID'} |
固定位置显示某父栏目的子栏目 | 需要手动填写父栏目的 typeid。 |
| 方法二 | 外层 type='top',内层 typeid='[field:id]' |
首页展示全站栏目结构 | 嵌套循环,利用 [field:id] 动态获取父ID。 |
| 方法三 | {dede:channel typeid='~id~'} |
在一级栏目页显示其下属栏目 | 在 list_article.htm 中使用,~id~ 自动获取当前栏ID。 |
重要提示:
- 获取栏目ID:在 DedeCMS 后台,将鼠标移动到“栏目管理”的某个栏目名称上,浏览器左下角状态栏会显示
catalog_edit.php?id=数字,这个数字就是该栏目的ID。 - 模板缓存:修改模板文件后,如果看不到效果,请去后台“生成” -> “更新HTML”,并确保模板缓存已关闭或已更新。
- CSS 样式:以上代码只提供了 HTML 结构,你需要配合 CSS 样式才能实现美观的布局,例如方法二中的
main-category和sub-category的样式。
希望这些详细的解释和示例能帮助你完全掌握在 DedeCMS 中循环二级栏目的方法!
