核心方法一:使用 channel 或 arclistsg 标签(最常用)
这是最标准、最推荐的方法,适用于在首页、列表页等地方调用指定一级栏目下的所有二级栏目。

(图片来源网络,侵删)
场景描述
假设你的网站有一个一级栏目叫“产品中心”(其ID为 2),下面有三个二级栏目:“产品A”、“产品B”、“产品C”,现在你想在首页的某个位置,只列出“产品中心”下的这三个二级栏目。
方法 1:使用 {dede:channel}
这个标签主要用于生成栏目导航,非常适合调用指定层级的子栏目。
代码示例:
{dede:channel type='son' typeid='2'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
代码详解:
(图片来源网络,侵删)
{dede:channel ...}:这是织梦的栏目调用标签。
type='son':这是最关键的属性,表示调用“子栏目”,它会调用当前指定 typeid 下的所有直接子栏目(即二级栏目)。
typeid='2':指定要调用其子栏目的一级栏目ID。你需要在这里替换成你自己的栏目ID。
[field:typelink/]:字段标签,表示栏目的完整链接地址(/plus/list.php?tid=3)。
[field:typename/]:字段标签,表示栏目的名称(“产品A”)。
方法 2:使用 {dede:arclistsg}
这个标签虽然主要用于调用文章列表,但它也可以非常方便地获取并循环子栏目信息,并且在循环中可以直接使用 {dede:field} 来获取子栏目信息。
代码示例:
{dede:arclistsg typeid='2' channelid='1'}
{dede:field name='typename'/} /
{/dede:arclistsg}
代码详解:
{dede:arclistsg ...}:文章列表专用标签,但支持获取子栏目。
typeid='2':指定要调用其子栏目的一级栏目ID。
channelid='1':指定模型ID,对于栏目调用,通常填写 1(普通文章模型)即可。
{dede:field name='typename'/}:在 arclistsg 循环体内,使用 field 标签来获取当前子栏目的名称。
核心方法二:使用 SQL 查询(最灵活)
当 channel 和 arclistsg 标签无法满足复杂需求时(需要调用跨栏目的二级栏目,或者需要根据特定条件筛选),直接使用 SQL 查询是最佳选择。
场景描述
你想调用所有一级栏目ID为 2、5、8 的二级栏目,并按排序号升序排列。
代码示例:
{dede:sql sql='SELECT id,typename,typedir FROM `dede_arctype` WHERE reid IN (2,5,8) AND ishidden<>1 ORDER BY sortrank ASC'}
<a href="[field:typedir function='str_replace("{cmspath}","",@me)'/]">[field:typename/]</a>
{/dede:sql}
代码详解:
{dede:sql ...}:织梦执行自定义SQL的标签。
sql='...':要执行的SQL语句。
dede_arctype:织梦存放栏目的核心数据表,如果你的表前缀不是 dede_,请修改。
WHERE reid IN (2,5,8):这是查询的核心条件。
reid 字段表示“上级栏目ID”。
IN (2,5,8) 表示查找所有 reid 为 2、5 或 8 的记录,也就是这些一级栏目下的所有二级栏目。
AND ishidden<>1:这是一个常用条件,用于过滤掉在后台被“隐藏”的栏目。
ORDER BY sortrank ASC:按后台设置的“排序值”进行升序排列。
[field:typedir ...]:typedir 字段包含的路径是 {cmspath}/a/b 这样的格式,需要用 str_replace 函数去掉 {cmspath} 才能得到正确的相对路径。
[field:typename/]:直接调用栏目名称。
特殊场景:在文章内容页(article_article.htm)调用当前文章所在二级栏目名称
这个需求很常见,比如在文章详情页显示面包屑导航。
代码示例:
当前位置:<a href='{dede:global.cfg_cmsurl/}/'>首页</a> >
{dede:field name='typename'/}
代码详解:
- 这个方法非常简单,因为文章内容页的模板中,
{dede:field name='typename'/} 这个标签默认就是获取当前文章所在顶级栏目的名称。
- 如果你想要的是直接上级栏目(也就是二级栏目)的名称,就需要稍微修改一下。
获取直接上级栏目(二级栏目)名称的方法:
{dede:geturl runphp='yes'}
$reid = @me;
$row = $dsql->GetOne("SELECT typename FROM `dede_arctype` WHERE id = $reid");
@me = $row['typename'];
{/dede:geturl}
代码详解:
{dede:geturl runphp='yes'}:geturl 标签可以获取当前栏目的ID,runphp='yes' 允许我们在PHP代码中使用这个ID。
$reid = @me;:将获取到的当前栏目ID(对于二级栏目来说,就是它自己的ID)赋值给变量 $reid。
$dsql->GetOne(...):使用织梦的全局数据库对象 $dsql 去查询 dede_arctype 表,根据ID获取栏目的 typename。
@me = $row['typename'];:将查询到的栏目名称重新赋值给 @me,@me 就是标签的最终输出结果。
总结与建议
场景
推荐方法
优点
缺点
调用指定一级栏目的所有二级栏目
{dede:channel type='son' typeid='N'}
代码简洁,语义清晰,专为导航设计
功能相对固定
调用指定一级栏目的所有二级栏目
{dede:arclistsg typeid='N'}
灵活,可在循环内调用更多子栏目信息
主要用于列表,稍显“重”
复杂查询、跨栏目调用
{dede:sql}
功能最强大,完全可控
需要懂SQL,代码稍复杂,有一定性能开销
在文章页获取上级栏目名
{dede:geturl runphp='yes'}
精准,能解决 typename 标签的局限性
代码稍复杂,需要理解PHP赋值 @me
给你的建议:
- 90% 的情况下,使用
{dede:channel type='son' typeid='你的ID'} 就足够了。 这是最标准、最易读的解决方案。
- 在使用任何标签前,请务必确认你的 栏目ID 和 表前缀(如果不是
dede_)。
- 如果遇到问题,请检查后台栏目管理中,相关栏目的“隐藏”选项是否被勾选。
这个标签主要用于生成栏目导航,非常适合调用指定层级的子栏目。
代码示例:
{dede:channel type='son' typeid='2'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
代码详解:

(图片来源网络,侵删)
{dede:channel ...}:这是织梦的栏目调用标签。type='son':这是最关键的属性,表示调用“子栏目”,它会调用当前指定typeid下的所有直接子栏目(即二级栏目)。typeid='2':指定要调用其子栏目的一级栏目ID。你需要在这里替换成你自己的栏目ID。[field:typelink/]:字段标签,表示栏目的完整链接地址(/plus/list.php?tid=3)。[field:typename/]:字段标签,表示栏目的名称(“产品A”)。
方法 2:使用 {dede:arclistsg}
这个标签虽然主要用于调用文章列表,但它也可以非常方便地获取并循环子栏目信息,并且在循环中可以直接使用 {dede:field} 来获取子栏目信息。
代码示例:
{dede:arclistsg typeid='2' channelid='1'}
{dede:field name='typename'/} /
{/dede:arclistsg}
代码详解:
{dede:arclistsg ...}:文章列表专用标签,但支持获取子栏目。
typeid='2':指定要调用其子栏目的一级栏目ID。
channelid='1':指定模型ID,对于栏目调用,通常填写 1(普通文章模型)即可。
{dede:field name='typename'/}:在 arclistsg 循环体内,使用 field 标签来获取当前子栏目的名称。
核心方法二:使用 SQL 查询(最灵活)
当 channel 和 arclistsg 标签无法满足复杂需求时(需要调用跨栏目的二级栏目,或者需要根据特定条件筛选),直接使用 SQL 查询是最佳选择。
场景描述
你想调用所有一级栏目ID为 2、5、8 的二级栏目,并按排序号升序排列。
代码示例:
{dede:sql sql='SELECT id,typename,typedir FROM `dede_arctype` WHERE reid IN (2,5,8) AND ishidden<>1 ORDER BY sortrank ASC'}
<a href="[field:typedir function='str_replace("{cmspath}","",@me)'/]">[field:typename/]</a>
{/dede:sql}
代码详解:
{dede:sql ...}:织梦执行自定义SQL的标签。
sql='...':要执行的SQL语句。
dede_arctype:织梦存放栏目的核心数据表,如果你的表前缀不是 dede_,请修改。
WHERE reid IN (2,5,8):这是查询的核心条件。
reid 字段表示“上级栏目ID”。
IN (2,5,8) 表示查找所有 reid 为 2、5 或 8 的记录,也就是这些一级栏目下的所有二级栏目。
AND ishidden<>1:这是一个常用条件,用于过滤掉在后台被“隐藏”的栏目。
ORDER BY sortrank ASC:按后台设置的“排序值”进行升序排列。
[field:typedir ...]:typedir 字段包含的路径是 {cmspath}/a/b 这样的格式,需要用 str_replace 函数去掉 {cmspath} 才能得到正确的相对路径。
[field:typename/]:直接调用栏目名称。
特殊场景:在文章内容页(article_article.htm)调用当前文章所在二级栏目名称
这个需求很常见,比如在文章详情页显示面包屑导航。
代码示例:
当前位置:<a href='{dede:global.cfg_cmsurl/}/'>首页</a> >
{dede:field name='typename'/}
代码详解:
- 这个方法非常简单,因为文章内容页的模板中,
{dede:field name='typename'/} 这个标签默认就是获取当前文章所在顶级栏目的名称。
- 如果你想要的是直接上级栏目(也就是二级栏目)的名称,就需要稍微修改一下。
获取直接上级栏目(二级栏目)名称的方法:
{dede:geturl runphp='yes'}
$reid = @me;
$row = $dsql->GetOne("SELECT typename FROM `dede_arctype` WHERE id = $reid");
@me = $row['typename'];
{/dede:geturl}
代码详解:
{dede:geturl runphp='yes'}:geturl 标签可以获取当前栏目的ID,runphp='yes' 允许我们在PHP代码中使用这个ID。
$reid = @me;:将获取到的当前栏目ID(对于二级栏目来说,就是它自己的ID)赋值给变量 $reid。
$dsql->GetOne(...):使用织梦的全局数据库对象 $dsql 去查询 dede_arctype 表,根据ID获取栏目的 typename。
@me = $row['typename'];:将查询到的栏目名称重新赋值给 @me,@me 就是标签的最终输出结果。
总结与建议
场景
推荐方法
优点
缺点
调用指定一级栏目的所有二级栏目
{dede:channel type='son' typeid='N'}
代码简洁,语义清晰,专为导航设计
功能相对固定
调用指定一级栏目的所有二级栏目
{dede:arclistsg typeid='N'}
灵活,可在循环内调用更多子栏目信息
主要用于列表,稍显“重”
复杂查询、跨栏目调用
{dede:sql}
功能最强大,完全可控
需要懂SQL,代码稍复杂,有一定性能开销
在文章页获取上级栏目名
{dede:geturl runphp='yes'}
精准,能解决 typename 标签的局限性
代码稍复杂,需要理解PHP赋值 @me
给你的建议:
- 90% 的情况下,使用
{dede:channel type='son' typeid='你的ID'} 就足够了。 这是最标准、最易读的解决方案。
- 在使用任何标签前,请务必确认你的 栏目ID 和 表前缀(如果不是
dede_)。
- 如果遇到问题,请检查后台栏目管理中,相关栏目的“隐藏”选项是否被勾选。
这个标签虽然主要用于调用文章列表,但它也可以非常方便地获取并循环子栏目信息,并且在循环中可以直接使用 {dede:field} 来获取子栏目信息。
代码示例:
{dede:arclistsg typeid='2' channelid='1'}
{dede:field name='typename'/} /
{/dede:arclistsg}
代码详解:
{dede:arclistsg ...}:文章列表专用标签,但支持获取子栏目。typeid='2':指定要调用其子栏目的一级栏目ID。channelid='1':指定模型ID,对于栏目调用,通常填写1(普通文章模型)即可。{dede:field name='typename'/}:在arclistsg循环体内,使用field标签来获取当前子栏目的名称。
核心方法二:使用 SQL 查询(最灵活)
当 channel 和 arclistsg 标签无法满足复杂需求时(需要调用跨栏目的二级栏目,或者需要根据特定条件筛选),直接使用 SQL 查询是最佳选择。
场景描述
你想调用所有一级栏目ID为 2、5、8 的二级栏目,并按排序号升序排列。
代码示例:
{dede:sql sql='SELECT id,typename,typedir FROM `dede_arctype` WHERE reid IN (2,5,8) AND ishidden<>1 ORDER BY sortrank ASC'}
<a href="[field:typedir function='str_replace("{cmspath}","",@me)'/]">[field:typename/]</a>
{/dede:sql}
代码详解:
{dede:sql ...}:织梦执行自定义SQL的标签。sql='...':要执行的SQL语句。dede_arctype:织梦存放栏目的核心数据表,如果你的表前缀不是dede_,请修改。WHERE reid IN (2,5,8):这是查询的核心条件。reid字段表示“上级栏目ID”。IN (2,5,8)表示查找所有reid为2、5或8的记录,也就是这些一级栏目下的所有二级栏目。
AND ishidden<>1:这是一个常用条件,用于过滤掉在后台被“隐藏”的栏目。ORDER BY sortrank ASC:按后台设置的“排序值”进行升序排列。[field:typedir ...]:typedir字段包含的路径是{cmspath}/a/b这样的格式,需要用str_replace函数去掉{cmspath}才能得到正确的相对路径。[field:typename/]:直接调用栏目名称。
特殊场景:在文章内容页(article_article.htm)调用当前文章所在二级栏目名称
这个需求很常见,比如在文章详情页显示面包屑导航。
代码示例:
当前位置:<a href='{dede:global.cfg_cmsurl/}/'>首页</a> >
{dede:field name='typename'/}
代码详解:
- 这个方法非常简单,因为文章内容页的模板中,
{dede:field name='typename'/}这个标签默认就是获取当前文章所在顶级栏目的名称。 - 如果你想要的是直接上级栏目(也就是二级栏目)的名称,就需要稍微修改一下。
获取直接上级栏目(二级栏目)名称的方法:
{dede:geturl runphp='yes'}
$reid = @me;
$row = $dsql->GetOne("SELECT typename FROM `dede_arctype` WHERE id = $reid");
@me = $row['typename'];
{/dede:geturl}
代码详解:
{dede:geturl runphp='yes'}:geturl标签可以获取当前栏目的ID,runphp='yes'允许我们在PHP代码中使用这个ID。$reid = @me;:将获取到的当前栏目ID(对于二级栏目来说,就是它自己的ID)赋值给变量$reid。$dsql->GetOne(...):使用织梦的全局数据库对象$dsql去查询dede_arctype表,根据ID获取栏目的typename。@me = $row['typename'];:将查询到的栏目名称重新赋值给@me,@me就是标签的最终输出结果。
总结与建议
| 场景 | 推荐方法 | 优点 | 缺点 |
|---|---|---|---|
| 调用指定一级栏目的所有二级栏目 | {dede:channel type='son' typeid='N'} |
代码简洁,语义清晰,专为导航设计 | 功能相对固定 |
| 调用指定一级栏目的所有二级栏目 | {dede:arclistsg typeid='N'} |
灵活,可在循环内调用更多子栏目信息 | 主要用于列表,稍显“重” |
| 复杂查询、跨栏目调用 | {dede:sql} |
功能最强大,完全可控 | 需要懂SQL,代码稍复杂,有一定性能开销 |
| 在文章页获取上级栏目名 | {dede:geturl runphp='yes'} |
精准,能解决 typename 标签的局限性 |
代码稍复杂,需要理解PHP赋值 @me |
给你的建议:
- 90% 的情况下,使用
{dede:channel type='son' typeid='你的ID'}就足够了。 这是最标准、最易读的解决方案。 - 在使用任何标签前,请务必确认你的 栏目ID 和 表前缀(如果不是
dede_)。 - 如果遇到问题,请检查后台栏目管理中,相关栏目的“隐藏”选项是否被勾选。
