{dede:channel}
{dede:channel} 是专门用于调用栏目的标签,通过设置其属性,我们可以精确地控制要显示哪些栏目。

(图片来源网络,侵删)
调用指定顶级栏目的直接子栏目(最常用)
这是最常见的需求,比如你在首页要显示“产品中心”这个栏目的所有一级子栏目。
标签语法
{dede:channel type='son' typeid='目标栏目的ID'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
参数详解
-
typeid='目标栏目的ID':- 这是最关键的参数,它告诉织梦,你要调用哪个栏目的子栏目。
'目标栏目的ID'需要替换成你想要获取子栏目的那个顶级栏目在后台的ID,如果你想在首页调用ID为5的“产品中心”栏目的子栏目,就写成typeid='5'。- 注意:在首页(
index.html)模板中,typeid默认是调用网站的顶级栏目,所以如果你想调用某个特定顶级栏目的子栏目,必须明确指定typeid。
-
type='son':- 这个参数指定了调用的栏目类型。
son: 表示调用指定typeid栏目的直接子栏目(下一级栏目)。self: 表示调用指定typeid栏目本身(通常用于面包屑导航)。top: 表示调用网站的顶级栏目(忽略typeid)。
完整示例
假设你在首页模板 index.html 中,想要调用ID为 5 的“产品中心”栏目的所有子栏目,并以无序列表的形式展示。

(图片来源网络,侵删)
<!-- 在首页模板中调用ID为5的栏目的子栏目 -->
<div class="product-categories">
<h3>产品分类</h3>
<ul>
{dede:channel type='son' typeid='5'}
<li>
<a href="[field:typelink/]" title="[field:typename/]">
[field:typename/]
</a>
</li>
{/dede:channel}
</ul>
</div>
代码解释:
{dede:channel type='son' typeid='5'}: 开始循环,调用ID为5的栏目的直接子栏目。<li>: 每个子栏目都会被包裹在一个<li>标签中。[field:typelink/]: 这是一个字段变量,代表子栏目的链接地址。[field:typename/]: 这是字段变量,代表子栏目的名称。</li>: 循环结束,每个子栏目标签闭合。</ul>和</div>: 容器标签闭合。
调用指定栏目的所有后代栏目(递归调用)
你可能需要显示一个栏目下的所有层级的子栏目,产品中心”下有“系列A”,系列A下还有“产品A1”、“产品A2”。
织梦的 channel 标签本身不支持递归,但我们可以通过自定义函数或SQL标签来实现,这里推荐使用 {dede:sql} 标签,因为它更灵活。
标签语法
{dede:sql sql='SELECT id,typename,typedir FROM dede_arctype WHERE reid = 目标栏目的ID ORDER BY sortrank'}
<a href="[field:typedir function='str_replace("{cmspath}", "", @me)'/]">[field:typename/]</a>
{/dede:sql}
参数详解
sql='...': 执行自定义的SQL查询语句。SELECT id,typename,typedir FROM dede_arctype: 从dede_arctype表(栏目表)中查询栏目的ID、名称和目录。WHERE reid = 目标栏目的ID: 这是关键。reid字段存储的是栏目的父栏目ID,通过设置reid,我们可以找到所有指定ID栏目的后代栏目(不限层级)。ORDER BY sortrank: 按照后台设置的排序进行排列。[field:typedir function='str_replace("{cmspath}", "", @me)'/]:typedir字段在数据库中存储的值是{cmspath}/product/a这样的形式。function='...'用于对字段值进行PHP函数处理。str_replace("{cmspath}", "", @me)的作用是将{cmspath}这个占位符替换为空,得到最终的URL路径,如/product/a。
完整示例
同样,调用ID为 5 的“产品中心”栏目的所有后代栏目。

(图片来源网络,侵删)
<div class="all-categories">
<h3>所有产品系列</h3>
<ul>
{dede:sql sql='SELECT id,typename,typedir FROM dede_arctype WHERE reid = 5 ORDER BY sortrank'}
<li>
<a href="[field:typedir function='str_replace("{cmspath}", "", @me)'/]">
[field:typename/]
</a>
</li>
{/dede:sql}
</ul>
</div>
调用当前栏目的子栏目
在列表页(list_article_*.html页(article_*.html)模板中,你可能需要调用当前所在栏目的子栏目。
标签语法
在这种情况下,你不需要指定 typeid,因为织梦会自动获取当前栏目的ID。
{dede:channel type='son'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
完整示例
在列表页模板 list_article.htm 中,添加以下代码可以显示当前分类的子分类。
<div class="sub-categories">
<h3>子分类</h3>
<ul>
{dede:channel type='son'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
这段代码在列表页中会自动调用当前栏目(即列表页所展示的栏目)的子栏目。
总结与最佳实践
| 需求场景 | 推荐标签 | 关键参数 | 说明 |
|---|---|---|---|
| 调用指定顶级栏目的直接子栏目(如首页调用产品分类) | {dede:channel} |
typeid='目标ID' type='son' |
最常用、最标准的方法。 |
| 调用指定栏目的所有后代栏目(不限层级) | {dede:sql} |
sql='WHERE reid = 目标ID' |
功能更强大,但需要一点SQL基础。 |
| 调用当前栏目的子栏目(如在列表页) | {dede:channel} |
type='son' (无需typeid) |
织梦会自动识别当前栏目ID,非常方便。 |
小贴士:如何找到栏目的ID?
登录织梦后台,进入“栏目管理”,将鼠标悬停在你想要查询的栏目名称上,浏览器左下角的状态栏会显示该栏目的编辑链接,.../catalog_add.php?cid=5,其中的 5 就是这个栏目的ID。
希望这份详细的指南能帮助你解决织梦调用子栏目的问题!
