核心标签
实现这个功能主要依赖于两个核心的 DedeCMS 标签:

{dede:field name='typeid' /}: 获取当前栏目的 ID。{dede:gettopid}: 这是一个功能强大的单标签,它会获取当前栏目(或文章)所在顶级栏目的 ID,在大多数情况下,我们需要的是直接父栏目,而不是顶级栏目,所以这个标签的直接使用场景较少,但理解它很重要。
使用 {dede:channel} 标签(最推荐、最灵活)
这是最常用且最灵活的方法,因为它不仅可以获取父栏目链接,还可以获取父栏目的名称、描述等其他信息。
原理
通过 typeid 属性指定父栏目的 ID,然后使用 type='top' 来确保只获取一个栏目信息。
示例代码
假设你想在子栏目页的页眉或页脚显示一个返回父栏目的链接。
<a href="{dede:field name='typeid' function="GetTopid(@me,0)"/}">返回上级栏目</a>
代码解析:

{dede:field name='typeid' /}: 先获取当前栏目的 ID。function="GetTopid(@me,0)": 这是关键,这是一个函数调用。@me: 代表前面{dede:field name='typeid' /}获取到的值(即当前栏目ID)。GetTopid(): 这是 DedeCMS 的一个内置函数,用于根据当前栏目ID获取其父栏目ID。0:GetTopid()函数的第二个参数,0表示获取直接父级栏目,1表示获取顶级栏目,我们这里需要直接父级,所以用0。
- 整个
{dede:field name='typeid' function="GetTopid(@me,0)"}的最终输出结果就是父栏目的ID。 <a href="...">: 将这个ID构造成一个标准的链接。
进阶示例:同时显示父栏目名称
{dede:channel typeid='{dede:field name='typeid' function="GetTopid(@me,0)"}' type='top'}
<a href="[field:typelink/]">返回[field:typename/]</a>
{/dede:channel}
代码解析:
{dede:channel ...}: 标签开始。typeid='{dede:field name='typeid' function="GetTopid(@me,0)"}': 将我们刚刚获取到的父栏目ID作为typeid参数传递给channeltype='top': 确保该标签只匹配这一个ID的栏目,避免循环或输出多个结果。[field:typelink/]: 输出该栏目的完整链接。[field:typename/]: 输出该栏目的名称。{dede:channel ...}: 标签结束。
这种方法结构清晰,可扩展性强,是处理此类问题的首选。
使用 {dede:field} 标签的 parentid 属性(简洁)
如果你的需求仅仅是获取父栏目的ID,并且不打算获取其他信息,这个方法更简洁。

原理
直接调用当前栏目的 parentid (父栏目ID) 字段。
示例代码
<a href="{dede:field name='parentid' runphp='yes'}">$id = @me; $row = GetOneType($id); @me = $row['typedir'];{/dede:field}">返回上级栏目</a>
代码解析:
{dede:field name='parentid' /}: 这个可以直接输出父栏目的ID,但如果我们想直接得到链接,就需要runphp。runphp='yes': 启用PHP代码执行。$id = @me;: 将{dede:field name='parentid'}的值(即父栏目ID)赋给变量$id。$row = GetOneType($id);: 调用 DedeCMS 函数GetOneType(),根据ID获取该栏目的完整信息,并存储在数组$row中。@me = $row['typedir'];: 从数组中取出栏目的目录地址(即链接路径),并重新赋值给@me。@me是模板引擎中代表当前标签值的变量。- 最终输出的就是父栏目的完整链接路径。
这种方法代码更紧凑,但可读性稍差,且不易扩展。
在列表页和内容页调用
在列表页 (list_article.htm) 和内容页 (article_article.htm) 调用父栏目链接,和方法一完全相同,因为 {dede:field name='typeid'} 在这两种页面中同样有效,它会获取当前所在的子栏目ID。
列表页示例 (list_article.htm)
<h2>当前位置:<a href="/">首页</a> > <a href="{dede:field name='typeid' function="GetTopid(@me,0)"}">{dede:field name='typename' function="GetTopid(@me,0)"/}</a></h2>
注意:这里的
function="GetTopid(@me,0)"用于获取父栏目的ID,然后我们再用{dede:type}标签来获取其名称和链接,上面的写法是简化的,更严谨的写法参考方法一的进阶示例。 页示例 (article_article.htm) 页,你可能需要一个“返回上级栏目”的按钮。
<p><a href="{dede:field name='typeid' function="GetTopid(@me,0)"/}">返回上级栏目</a></p>
或者使用更严谨的 最终建议: 为了代码的健壮性和未来的可维护性,强烈推荐使用 方法一 ({dede:channel}
{dede:channel typeid='{dede:field name='typeid' function="GetTopid(@me,0)"}' type='top'}
<p><a href="[field:typelink/]">返回[field:typename/]</a></p>
{/dede:channel}
总结与对比
方法
优点
缺点
推荐场景
{dede:channel}最灵活,可获取名称、链接等多种信息;结构清晰,易于维护和扩展。
代码稍长,需要嵌套标签。
绝大多数情况下的首选,尤其是在需要显示栏目名称时。
{dede:field}+runphp代码简洁,直接在单标签内完成所有操作。
可读性差,不易扩展;如果DedeCMS内核函数变更,可能有风险。
只需要父栏目链接,且追求代码极致简洁的场景。
通用
通用性强,适用于列表页、内容页。
需要理解不同页面下
{dede:field name='typeid'} 的含义。所有需要调用父栏目信息的页面。
{dede:channel},它虽然代码量稍多,但逻辑清晰,功能强大,是 DedeCMS 模板开发中的最佳实践。
