在列表页(list_article.htm页(article_article.htm)调用
这是最常见的需求,因为在这类页面,我们知道自己属于哪个栏目,并且需要向上追溯其顶级栏目。

(图片来源网络,侵删)
推荐方法:使用 GetTopid 函数
这是最灵活、最可靠的方法,它不依赖于栏目的固定层级(比如不一定是二级栏目),可以正确处理三级、四级栏目等任意层级嵌套。
标签写法:
{dede:field name='typeid' function="GetTopid(@me)"/}
代码解析:
{dede:field name='typeid'}: 这个标签用于获取当前页面所在栏目的 ID,如果当前文章在 ID 为 25 的栏目下,这个标签会输出25。function="GetTopid(@me)": 这是关键部分,它对typeid的值(即25)执行一个名为GetTopid的 PHP 函数。GetTopid()函数的作用是:根据一个栏目 ID,向上递归查询,直到找到顶级栏目,然后返回这个顶级栏目的 ID。- 注意:这个标签默认输出的是 顶级栏目的 ID,而不是名称,如果你需要直接获取名称,可以结合
type标签一起使用。
获取顶级栏目名称(基于 GetTopid)
如果你需要直接输出顶级栏目的 名称 而不是 ID,你需要将两个标签结合使用。

(图片来源网络,侵删)
标签写法:
{dede:channel type='top' currentid=''}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
上面的写法是错误的! currentid 属性在这里无法正确接收 GetTopid 函数的返回值,正确的做法是使用一个更直接或通过变量传递的方法。
正确且简洁的写法(推荐):
{dede:field name='typeid' function="getTopTypename(@me)"/}
代码解析:
- 这种写法需要一个自定义的函数
getTopTypename,你需要在 DedeCMS 的核心文件中添加这个函数,或者使用更巧妙的方式。 - 一个更简单且无需修改核心文件的方法是使用一个嵌套的
channel标签,并利用其currentid属性。
使用嵌套 channel 标签(推荐,无需修改文件)
这是最推荐的方法,因为它完全在模板文件内实现,安全且易于理解。
标签写法:
{dede:channel type='top' currentid='{dede:field.name='typeid'/}'}
[field:typename/]
{/dede:channel}
代码解析:
{dede:channel type='top' ...}:channel标签用于调用栏目。type='top'的作用是只调用 所有顶级栏目。currentid='{dede:field.name='typeid'/}': 这是这个方法的精髓。- 内层的
{dede:field.name='typeid'/}会先执行,获取当前栏目的 ID。 - 这个 ID 会被作为
currentid的值传递给外层的channelchannel标签在遍历所有顶级栏目时,会检查哪个栏目的 ID 等于currentid,current这个栏目就会带上current样式或属性。
- 内层的
[field:typename/]: 在channel标签内部,[field:typename/]会输出当前循环到的栏目的名称,因为currentid的作用,它最终只会输出与当前页面所属顶级栏目匹配的那个名称。
列表页/内容页):
- 获取顶级栏目 ID:
{dede:field name='typeid' function="GetTopid(@me)"/} - 获取顶级栏目名称(最佳实践):
{dede:channel type='top' currentid='{dede:field.name='typeid'/}'} [field:typename/] {/dede:channel}
在首页(index.htm)调用
首页不属于任何一个具体栏目,所以不能直接调用,但如果你想在首页显示某个特定顶级栏目的名称,你需要指定那个栏目的 ID。
标签写法:
{dede:channel type='top' row='1' typeid='1'}
[field:typename/]
{/dede:channel}
代码解析:
type='top': 同样,只调用顶级栏目。typeid='1': 关键属性,这里指定了你要调用的顶级栏目的 ID,将'1'替换成你想要显示的顶级栏目的实际 ID。row='1': 表示只调用一条记录(即你指定的那个栏目)。
在自定义页面(如 page_about.htm)调用
自定义页面通常不关联任何栏目,如果需要调用,你需要在后台的“自定义页面”管理中,为该页面指定一个关联栏目。
-
在后台设置: 进入“后台” -> “维护” -> “自定义管理”,找到你需要编辑的页面,点击“编辑”。 在页面内容下方,有一个“关联栏目”选项,选择一个顶级栏目,然后更新。
-
在模板中使用标签: 设置好关联栏目后,你就可以使用和列表页/内容页完全相同的标签来调用了。
标签写法(与场景一相同):
{dede:channel type='top' currentid='{dede:field.name='typeid'/}'}
[field:typename/]
{/dede:channel}
总结与对比
| 场景 | 推荐标签 | 说明 |
|---|---|---|
| 列表页 / 内容页 | {dede:channel type='top' currentid='{dede:field.name='typeid'/}'}[field:typename/]{/dede:channel}` |
最通用、最推荐,能处理任意层级的栏目嵌套,直接输出名称。 |
| 列表页 / 内容页 | {dede:field name='typeid' function="GetTopid(@me)"/} |
输出顶级栏目的 ID,如果需要名称,需进一步处理。 |
| 首页 | {dede:channel type='top' typeid='1'}[field:typename/]{/dede:channel}| 需要手动指定typeid` 来调用指定的顶级栏目。 |
|
| 自定义页面 | {dede:channel type='top' currentid='{dede:field.name='typeid'/}'}[field:typename/]{/dede:channel}` |
需要先在后台为页面设置“关联栏目”。 |
希望这个详细的解释能帮助你解决问题!在实际使用中,场景一中的嵌套 channel 标签方法 是最常用和最可靠的。
