使用 channelartlist 标签(最推荐、最灵活)
这是官方推荐且功能最强大的方法,专门用于调用带有子栏目的栏目列表,它可以在一个标签内完成“调用一级栏目 + 循环调用其二级栏目”的所有操作。

(图片来源网络,侵删)
准备工作
确保你的网站后台已经正确设置了栏目层级。
- 一级栏目 (顶级栏目):
- 产品中心
- 新闻资讯
- 关于我们
- 二级栏目 (子栏目):
- 产品中心
- 产品分类 A
- 产品分类 B
- 新闻资讯
- 公司新闻
- 行业动态
- 产品中心
在首页模板 (index.htm) 中添加代码
将以下代码放置在你希望显示这些栏目列表的位置。
{dede:channelartlist typeid='0' row='10'}
<!-- 循环开始,row='10' 表示调用10个一级栏目,typeid='0' 表示调用所有顶级栏目 -->
<div class="main-box">
<!-- 一级栏目名称 -->
<h2><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></h2>
<!-- 调用当前一级栏目下的所有二级栏目 -->
<ul class="sub-list">
{dede:channel type='son' noself='yes'}
<!--
type='son' 表示调用子栏目。
noself='yes' 表示不调用栏目本身(即不重复显示一级栏目)。
如果想显示所有下级栏目(包括孙栏目),可以用 `type='sun'`。
-->
<li>
<a href="[field:typelink/]">[field:typename/]</a>
<!--
如果想在二级栏目后面再调用三级栏目,可以在这里继续嵌套 channel 标签。
但注意,过多的嵌套会影响性能,且代码结构会变复杂。
-->
</li>
{/dede:channel}
</ul>
</div>
{/dede:channelartlist}
代码详解
-
{dede:channelartlist ...}: 外层循环,用于获取一级栏目。typeid='0': 调用所有顶级栏目,如果你想只调用指定的几个一级栏目,可以填写它们的ID,用逗号隔开,typeid='1,3,5'。row='10': 限制调用的一级栏目数量。cacheid='channelartlist': 可选,用于设置缓存ID,提高首页加载速度。
-
{dede:field name='typeurl'/}: 获取当前一级栏目的链接地址。
(图片来源网络,侵删) -
{dede:field name='typename'/}: 获取当前一级栏目的名称。 -
{dede:channel type='son' noself='yes'}: 内层循环,用于获取当前一级栏目下的二级栏目。type='son': 指定获取类型为“子栏目”。noself='yes': 不包含栏目本身,如果省略,那么一级栏目也会出现在列表中,通常我们不希望这样。
使用 arclist 标签(适用于调用带缩进的栏目)
如果你只是想在首页以列表形式展示所有栏目(包括一级和二级),并希望用缩进来体现层级关系,arclist 标签也是一个不错的选择。
在首页模板中添加代码
<ul class="all-category-list">
{dede:channelartlist typeid='0'}
<li>
<h3><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></h3>
<div class="sub-category">
{dede:channel type='son' row='8' noself='yes'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
</div>
</li>
{/dede:channelartlist}
</ul>
这个方法和方法一非常相似,只是外层循环的HTML结构做了调整,使其更符合一个“栏目块”的展示方式。

(图片来源网络,侵删)
手动调用指定的一级栏目及其子栏目(适用于布局复杂的首页)
如果你的首页布局非常特殊,产品中心”和“新闻资讯”要放在完全不同的位置,那么就不适合用一个大的循环来处理,你可以分别为它们调用。
场景假设
首页左侧是“产品中心”及其子栏目,右侧是“新闻资讯”及其子栏目。
在首页模板中添加代码
左侧代码 (产品中心):
假设“产品中心”的一级栏目ID是 1。
<div class="left-box">
<h2>产品中心</h2>
<ul>
{dede:channel type='son' typeid='1' row='8'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
右侧代码 (新闻资讯):
假设“新闻资讯”的一级栏目ID是 2。
<div class="right-box">
<h2>新闻资讯</h2>
<ul>
{dede:channel type='son' typeid='2' row='8'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
代码详解
typeid='1': 这里是关键,明确指定了要调用哪个一级栏目下的子栏目。type='son': 同样,表示调用子栏目。- 这种方法非常直观,易于控制,但代码会比较冗余,如果栏目多,会写很多重复的代码。
重要注意事项
- 栏目ID: 在使用
typeid时,务必去后台“栏目管理”中找到对应栏目的准确ID。 - 栏目模型: 确保你的二级栏目没有被设置为“外部链接”模型,否则
channel标签可能无法正确获取其链接和名称。 - 缓存问题: DedeCMS 默认有缓存,修改完模板后,如果首页没有立即更新,可以:
- 进入后台“生成” -> “更新主页HTML”,点击“更新主页”。
- 或者清空一下系统缓存。
- CSS样式: 上述代码中的
class(如main-box,sub-list) 是为了方便你添加CSS样式,你需要根据自己的网站设计,编写相应的CSS来美化这些列表的显示效果(设置间距、字体颜色、背景等)。 - 栏目为空: 如果某个一级栏目下没有发布任何子栏目,
{dede:channel type='son'...}这个循环将不会输出任何内容,页面会留出一个空白,你可以在循环外用{dede:field name='typeid' function="isHasSon(@me)"/}这样的方式判断并做相应处理,或者用CSS隐藏空的容器。
希望这些详细的解释和示例能帮助你成功在首页调用多个二级栏目!
