使用 {dede:channel} 标签(最常用、最灵活)
这是最推荐的方法,因为它功能强大,可以灵活地控制一二级栏目的显示层级和样式。

调用当前栏目的顶级栏目(一级栏目名称)
这个需求通常用在面包屑导航或者页面标题中,显示当前栏目属于哪个一级栏目。
使用场景:在列表页或内容页,获取当前栏目的“父级”或“顶级”栏目名称。
核心标签:{dede:field name='typename' /} 和 {dede:field name='topid' /}
{dede:field name='typename' /}:获取当前栏目的名称。{dede:field name='topid' /}:获取当前栏目的顶级栏目ID。
示例代码(在列表页 list_article.htm 或内容页 article_article.htm 中):

假设当前栏目是“科技”下的“手机”,顶级栏目是“科技”。
<h1>当前一级栏目是:<strong>{dede:field name='typename' /}</strong></h1>
这段代码会直接输出“手机”,如果想输出它的一级栏目“科技”,我们需要用到 正确获取一级栏目名称的方法: 上面的代码会输出所有一级栏目,如果我们只想输出当前栏目的那一项,可以这样: 更简洁的方案(适用于已知顶级栏目ID): 如果你知道当前顶级栏目ID,可以直接调用: 这是最常见的二级菜单需求,比如网站的顶部导航栏。 使用场景:在网站头部,显示所有一级栏目,并在鼠标悬停时显示其下的所有二级栏目。 核心标签: 示例代码(通常放在 代码解释: 当你需要非常复杂的查询,或者 使用场景:调用特定条件的栏目,或者获取栏目的一些额外信息。 核心标签: 示例1:获取所有一级栏目名称 示例2:获取指定一级栏目下的所有二级栏目名称 假设一级栏目“科技”的 ID 是 1。 这个需求通常用在文章内容页,显示文章所在的完整栏目路径(面包屑)。 使用场景:在 核心标签: 示例代码: 输出结果:
如果你想自定义分隔符或者去掉最后一项(文章标题),可以使用下面的方法: 这个标签只输出“科技 > 手机”路径,不包含文章标题。 对于绝大多数情况,优先使用 {dede:channel}
{dede:channel type='top' typeid=''}
<a href="[field:typelink/]">[field:typename/]</a>
{dede:son}
<!-- 这里可以循环输出二级栏目 -->
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:son}
{/dede:channel}
{dede:channel type='top' row='1' currentid='[field:id]'}
当前一级栏目是:<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
{dede:channel typeid='1'} <!-- 将 '1' 替换为你的顶级栏目ID -->
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
调用一级栏目及其下的所有二级栏目(典型的二级导航)
{dede:channel type='top'} 和 {dede:son}
type='top':表示只调用顶级栏目(一级栏目)。{dede:son}:在 {dede:channel} 循环内部使用,用于输出当前一级栏目下的所有子栏目(二级栏目)。head.htm 或其他公共模板文件中):<ul class="nav">
{dede:channel type='top' row='8'}
<li>
<a href="[field:typelink/]">[field:typename/]</a>
<!-- 检查当前一级栏目下是否有子栏目,有则显示下拉菜单 -->
{dede:son}
<div class="sub-nav">
<ul>
{dede:field name='sonlist'/}
<!-- 或者手动循环,更灵活 -->
<!-- {dede:son}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:son} -->
</ul>
</div>
{/dede:son}
</li>
{/dede:channel}
</ul>
{dede:channel type='top'} 会循环遍历所有一级栏目。[field:typelink/] 和 [field:typename/] 分别输出当前一级栏目的链接和名称。{dede:son} 会判断当前循环的一级栏目是否有子栏目,如果有,则执行内部的代码。{dede:field name='sonlist'/} 是一个快捷方式,会直接输出一个包含所有子栏目的 <ul> 列表,如果你想自定义样式,使用手动循环的方式(注释掉的部分)会更灵活。
使用
{dede:sql} 标签(直接查询数据库){dede:channel} 标签无法满足需求时,可以直接使用原生 SQL 语句来查询。{dede:sql sql=''}
sql='':里面填写你的 SQL 查询语句。{dede:sql sql="SELECT id,typename,typedir FROM `#@__arctype` WHERE reid=0 ORDER BY sortrank"}
<a href="[field:typedir function='str_replace("{cmspath}", "", "@me")'/]">[field:typename/]</a>
{/dede:sql}
reid=0 是判断是否为顶级栏目的关键条件。str_replace("{cmspath}", "", "@me") 是一个函数,用来替换掉栏目路径中的 {cmspath} 变量,得到正确的URL。{dede:sql sql="SELECT id,typename,typedir FROM `#@__arctype` WHERE reid=1 ORDER BY sortrank"}
<a href="[field:typedir function='str_replace("{cmspath}", "", "@me")'/]">[field:typename/]</a>
{/dede:sql}
页调用当前栏目路径
article_article.htm 中显示“首页 > 科技 > 手机 > 文章标题”。{dede:field name='position' /}<div class="breadcrumb">
{dede:field name='position' /}
</div>
<a href='http://yourdomain.com/'>首页</a> > <a href='http://yourdomain.com/tech/'>科技</a> > <a href='http://yourdomain.com/tech/mobile/'>手机</a> > 文章标题{dede:field name='typelink' /}
总结与对比
方法
适用场景
优点
缺点
{dede:channel}最常用,调用一级、二级栏目,制作导航菜单。
灵活、强大、官方推荐,支持多种参数和嵌套(如
{dede:son})。需要理解其参数和嵌套逻辑。
{dede:sql}复杂查询、
{dede:channel} 无法满足时。灵活性极高,可以获取任何数据库信息。
需要懂 SQL 语句,有安全风险(需注意防注入)。
{dede:field}内容页/列表页,获取当前栏目信息、顶级栏目ID、面包屑路径。
简洁、高效,专为当前页面数据设计。
只能获取与当前栏目相关的信息,不能跨栏目调用。
{dede:channel},它能解决 99% 的栏目调用需求,只有在特殊情况下,才考虑使用 {dede:sql}。
