使用 channelartlist 标签(推荐,最常用)
channelartlist 是专门用于调用一级栏目并循环的标签,它会自动将当前循环的栏目信息注入到环境变量中,方便在循环内部调用其子栏目。

(图片来源网络,侵删)
标签结构:
{channelartlist typeid='0' }
<!-- 循环开始,typeid='0' 表示调用所有顶级栏目 -->
<!-- 一级栏目信息 -->
<div class="main-nav">
<h2><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></h2>
<!-- 在循环内部,使用 {dede:channel} 来调用当前一级栏目的子栏目 -->
<div class="sub-nav">
<ul>
{dede:channel type='son' noself='yes'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
</div>
{/channelartlist}
代码详解:
-
{channelartlist typeid='0'}channelartlist: 指定使用此标签来循环栏目。typeid='0': 这是关键参数。typeid用于指定要调用的栏目ID。'0'代表所有顶级栏目(即一级栏目),如果你想指定特定的一级栏目,可以用逗号隔开,typeid='1,3,5'。- 这个标签对会循环遍历所有匹配的一级栏目。
-
{dede:field name='typeurl'/}
(图片来源网络,侵删)- 在
channelartlist循环内部,{dede:field}标签会自动获取当前栏目的信息。 name='typeurl': 获取当前一级栏目的链接地址。
- 在
-
{dede:field name='typename'/}name='typename': 获取当前一级栏目的名称。
-
{dede:channel type='son' noself='yes'}- 这个标签嵌套在
channelartlist内部,用于调用当前正在循环的这个一级栏目的子栏目。 type='son': 指定调用类型为“子栏目”。noself='yes': 表示不调用栏目本身,只调用它的子栏目,这通常是我们想要的效果。
- 这个标签嵌套在
使用 arclist 标签(适用于特定场景)
arclist 主要是用于调用文档(文章)列表,但通过设置 channel 和 typeid 参数,也可以实现类似的效果,这种方法不如 channelartlist 直观,但有时也很有用。
标签结构:

(图片来源网络,侵删)
{dede:channel type='top' }
<div class="channel-item">
<a href="[field:typelink/]">[field:typename/]</a>
</div>
{/dede:channel}
代码详解:
-
{dede:channel type='top'}channel: 调用栏目。type='top': 这是核心参数,表示调用所有顶级栏目(一级栏目)。
-
[field:typelink/]和[field:typename/]- 在
channel标签内部,使用[field:xxx/]的形式来获取栏目信息。 typelink: 栏目链接。typename: 栏目名称。
- 在
注意: channelartlist 的优势在于可以在循环内部方便地调用子栏目,而 channel 标签不行,如果你只是想单纯列出一级栏目的链接,channel 也可以,但 channelartlist 更强大、更灵活。
使用 SQL 查询(最灵活,适合有复杂需求的场景)
如果你需要对栏目进行更复杂的筛选、排序或处理,可以直接使用 dede:sql 标签执行原生SQL查询。
前提:
你需要知道DedeCMS中存储栏目的表是 dede_arctype。
标签结构:
{dede:sql sql='SELECT id, typename, typedir FROM `dede_arctype` WHERE reid=0 ORDER BY id ASC'}
<div class="channel-item">
<!-- 使用 [field:xxx/] 来获取SQL查询返回的字段 -->
<a href="[field:typedir function='str_replace("{cmspath}","",@me)'/]">[field:typename/]</a>
</div>
{/dede:sql}
代码详解:
-
sql='SELECT ... 'SELECT id, typename, typedir: 选择你需要的栏目字段。FROM dede_arctype: 从栏目表查询。WHERE reid=0:reid字段表示“父栏目ID”,reid=0就是筛选出所有顶级栏目(一级栏目)。ORDER BY id ASC: 按栏目ID升序排列。
-
[field:typedir function='str_replace("{cmspath}","",@me)'/]typedir字段在数据库中存储的值是{cmspath}/a/b这样的格式,{cmspath}是网站根目录变量。- 使用
function对字段值进行处理,用str_replace将{cmspath}替换为空,得到正确的相对路径。
总结与推荐
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
channelartlist |
代码最直观、最易读,专门为此设计,可方便地在循环内调用子栏目 | 灵活性相对SQL稍差 | 绝大多数情况下的首选,特别是需要制作带下拉菜单的多级导航时。 |
channel |
语法简单,代码量少 | 无法在循环内直接调用子栏目,功能单一 | 只需要简单列出一级栏目名称和链接时。 |
dede:sql |
灵活性最高,可以执行任何复杂的SQL查询,进行任意筛选和排序 | 需要了解数据库结构,代码可读性差,有安全风险(需注意防SQL注入) | 有非常特殊的需求,比如按特定条件筛选栏目、或者栏目数据有特殊处理时。 |
对于99%的需求,强烈推荐使用方法一 channelartlist,它既简洁又强大,是DedeCMS模板设计的标准做法。
