核心标签解析
-
{dede:channelartlist}:
(图片来源网络,侵删)- 作用: 这个标签用于获取一个或多个指定父栏目及其下的子栏目列表,它本身会循环父栏目。
- 关键属性:
typeid: 核心属性,用于指定要调用的父栏目ID,如果指定多个ID,用英文逗号隔开,typeid='1,3',如果不指定typeid,则默认调用当前栏目的所有同级栏目和它的子栏目。row: 显示的父栏目数量。
-
{dede:channel}:- 作用: 在
{dede:channelartlist}的循环内部,用于获取当前父栏目下的子栏目列表。 - 关键属性:
typeid: 在channelartlist内部使用时,这个属性可以省略,它会自动获取当前循环到的父栏目的ID。row: 显示的子栏目数量。type:'son'表示显示所有子栏目,默认值就是'son',所以通常可以不写。
- 作用: 在
调用指定一个父栏目的所有子栏目
这是最常见的需求,在网站首页调用 "产品中心" 栏目下的所有产品分类。
假设 "产品中心" 栏目的 ID 是 5。
代码示例:

(图片来源网络,侵删)
{dede:channelartlist typeid='5'}
<h2>{dede:field name='typename'/}</h2>
<ul>
{dede:channel type='son'}
<li>
<a href="[field:typelink/]">[field:typename/]</a>
</li>
{/dede:channel}
</ul>
{/dede:channelartlist}
代码解释:
-
{dede:channelartlist typeid='5'}:typeid='5'指定了我们要操作的父栏目是 ID 为 5 的 "产品中心"。- 这段代码会先找到 ID 为 5 的栏目,并将其信息(如栏目名称)提供给内部的
{dede:field name='typename'}。
-
<h2>{dede:field name='typename'}/}</h2>:channelartlist内部的{dede:field}标签用于获取父栏目的信息。name='typename'获取的是父栏目(ID=5)的名称,即 "产品中心"。
-
{dede:channel type='son'}:
(图片来源网络,侵删)- 这个标签在
channelartlist内部,它会自动获取当前父栏目(ID=5)下的所有子栏目。 type='son'是默认值,可以省略,明确写上有助于理解代码。
- 这个标签在
-
[field:typelink/]和[field:typename/]:- 这是
channel标签内的底层字段,用于获取子栏目的信息。 [field:typelink/]: 子栏目的链接地址。[field:typename/]: 子栏目的名称。
- 这是
调用指定多个父栏目的子栏目
在首页同时展示 "产品中心" (ID=5) 和 "新闻资讯" (ID=7) 下的所有子栏目。
代码示例:
{dede:channelartlist typeid='5,7'}
<h2>{dede:field name='typename'/}</h2>
<ul>
{dede:channel type='son'}
<li>
<a href="[field:typelink/]">[field:typename/]</a>
</li>
{/dede:channel}
</ul>
{/dede:channelartlist}
代码解释:
- 唯一的区别在于
typeid='5,7',用英文逗号分隔了多个父栏目ID。 channelartlist会依次循环 ID 为 5 和 ID 为 7 的父栏目,每次循环都会输出一个<h2>和对应的子栏目列表。
只调用指定父栏目的前 N 个子栏目
"产品中心" (ID=5) 下有很多子栏目,但我们只想在首页显示前 4 个。
代码示例:
{dede:channelartlist typeid='5'}
<h2>{dede:field name='typename'/}</h2>
<ul>
{dede:channel row='4' type='son'}
<li>
<a href="[field:typelink/]">[field:typename/]</a>
</li>
{/dede:channel}
</ul>
{/dede:channelartlist}
代码解释:
- 在
{dede:channel}标签中增加了row='4'属性,这限制了输出的子栏目数量为 4 个。
在当前栏目页调用其子栏目
这是一个非常实用的场景,你进入了 "产品中心" (ID=5) 这个栏目页,你希望在这个页面里直接列出它下面的所有产品分类。
代码示例:
{dede:channelartlist}
<h2>{dede:field name='typename'/}</h2>
<ul>
{dede:channel type='son'}
<li>
<a href="[field:typelink/]">[field:typename/]</a>
</li>
{/dede:channel}
</ul>
{/dede:channelartlist}
代码解释:
- 这次
{dede:channelartlist}没有指定typeid。 - 当
typeid不存在时,channelartlist会默认获取当前栏目及其同级栏目。 - 由于我们只关心当前栏目,所以内部的
{dede:channel type='son'}会完美地调用出当前栏目的所有子栏目,这个方法非常方便,无需手动查找当前栏目的ID。
其他相关标签(补充)
虽然 channelartlist 是最推荐的方法,但了解其他方法也有助于你处理不同需求。
{dede:channel} 单独使用
如果你想调用所有顶级栏目(一级栏目),可以这样用:
{dede:channel type='top'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
type='top'表示只调用顶级栏目。
{dede:sql} 自定义SQL查询(最灵活)
如果以上方法无法满足你的复杂需求(根据特定条件筛选子栏目),你可以直接使用SQL标签。
示例:调用 ID 为 5 的父栏目下,且 arcrank (文章状态) 为 -1 (正常) 的子栏目。
{dede:sql sql='SELECT id, typename, typelink FROM `dede_arctype` WHERE reid = 5 AND arcrank = -1 ORDER BY sortrank ASC'}
<li><a href='[field:typelink/]'>[field:typename/]</a></li>
{/dede:sql}
代码解释:
sql='...': 在这里写你的 SQL 查询语句。dede_arctype: DedeCMS 存储栏目的数据表。reid = 5:reid字段存储的是父栏目的ID。reid = 5就是查找父ID为5的所有子栏目。[field:typelink/]和[field:typename/]:sql标签也可以使用底层字段来获取查询结果。
总结与最佳实践
| 场景 | 推荐标签 | 关键属性 |
|---|---|---|
| 调用指定父栏目的子栏目 | {dede:channelartlist} + {dede:channel} |
typeid='父栏目ID' |
| 调用多个父栏目的子栏目 | {dede:channelartlist} + {dede:channel} |
typeid='ID1,ID2' |
| 限制子栏目数量 | {dede:channelartlist} + {dede:channel} |
在{dede:channel}中使用 row='N' |
| 在当前栏目页调用子栏目 | {dede:channelartlist} + {dede:channel} |
不指定 typeid |
| 调用所有顶级栏目 | {dede:channel} |
