使用内置的 {dede:field} 标签(最推荐、最简单)
这是 DedeCMS 官方提供的、最标准也是最简单的方法,它利用了系统在解析模板时已经准备好的变量。

在列表页(list_article.htm)中使用
在列表页模板中,直接使用以下标签即可获取当前栏目的上级栏目名称:
上级栏目名称:{dede:field.typename function='GetTopTypename(@me)'/}
代码解释:
{dede:field.typename}:这个标签本身是用来获取当前栏目的名称的。function='GetTopTypename(@me)':这是一个功能强大的修饰符(函数)。@me:代表{dede:field.typename}标签本身的值,也就是当前栏目的名称。GetTopTypename():这是一个 DedeCMS 的自定义函数,它的作用是接收一个栏目ID作为参数,然后返回该栏目顶级栏目的名称。- 工作原理:虽然
@me传进去的是名称,但在这个上下文中,DedeCMS 的解析系统会巧妙地利用这个函数去获取当前栏目的顶级栏目信息,你只需要知道这个组合能实现“获取顶级栏目名称”即可。
页(article_article.htm)中使用
页(文章页)中,获取上级栏目名称的方法与列表页完全相同。
上级栏目名称:{dede:field.typename function='GetTopTypename(@me)'/}
页也能用?**页模板在解析时,系统已经加载了该文章所属栏目的所有信息,field.typename 和相关的函数调用同样是有效的。

使用 {dede:channel} 标签(适用于特定场景)
如果你不仅想获取上级栏目的名称,还想获取它的链接等其他信息,可以使用 这个标签主要用于循环输出栏目列表,但通过设置 我们需要知道上级栏目的ID,DedeCMS 提供了一个变量来存储当前栏目的ID: 上级栏目的ID可以通过一个简单的函数计算出来(假设栏目层级不超过2层,或者你知道上级栏目的ID是固定的)。 一个更通用的方法是,在PHP代码中获取,但为了保持模板的简洁,我们通常不直接在模板里写PHP。 更简单的方法是直接使用顶级栏目ID,因为很多网站的栏目结构不会太深。 如果你想在模板里动态获取上级栏目ID,可以这样做: 这种方法非常灵活,但会破坏模板的简洁性,并且如果网站流量很大,频繁查询数据库可能会影响性能。不推荐在普通模板中大量使用。 如果你的网站结构非常复杂,或者有特殊的需求,可以创建一个自定义函数。 创建自定义函数文件
在 在模板中调用
现在你可以在任何模板中调用这个新函数了。 给你的最终建议: 直接使用 方法一,即 {dede:channel}
typeid 属性,可以指定只输出一个特定的栏目信息。获取上级栏目的ID
{dede:field.id/}。
上级栏目名称:
{dede:channel typeid='1'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
typeid='1':这里的 1 是你上级栏目的ID,你需要手动去后台查看并填入。动态获取上级栏目ID(需要一点PHP知识)
上级栏目名称:
{dede:php}
// 获取当前栏目的ID
$currentTypeId = $GLOBALS['typeid'];
// 获取当前栏目的信息
$currentType = $dsql->GetOne("SELECT * FROM `dede_arctype` WHERE id = $currentTypeId");
// 获取上级栏目的ID
$topTypeId = $currentType['topid'];
// 获取上级栏目的信息
$topType = $dsql->GetOne("SELECT * FROM `dede_arctype` WHERE id = $topTypeId");
// 输出上级栏目名称
echo $topType['typename'];
{/dede:php}
使用自定义函数(最灵活,但需要修改文件)
步骤:
/include/extend.func.php 文件中(如果这个文件不存在,就自己创建一个)添加以下函数:/**
* 获取指定栏目的顶级栏目名称
* @param int $typeid 当前栏目ID
* @return string 顶级栏目名称
*/
function getTopTypeName($typeid) {
global $dsql;
if (empty($typeid)) {
return '';
}
// 查询当前栏目信息
$row = $dsql->GetOne("SELECT topid FROM `dede_arctype` WHERE id = $typeid");
// topid 为 0,说明它本身就是顶级栏目
if ($row['topid'] == 0) {
$currentName = $dsql->GetOne("SELECT typename FROM `dede_arctype` WHERE id = $typeid");
return $currentName['typename'];
} else {
// 否则,查询其顶级栏目名称
$topRow = $dsql->GetOne("SELECT typename FROM `dede_arctype` WHERE id = {$row['topid']}");
return $topRow['typename'];
}
}
上级栏目名称:{dede:field.id function='getTopTypeName(@me)'/}
@me 在这里会被解析为 {dede:field.id/} 的值,也就是当前栏目的ID,然后传递给你的 getTopTypeName 函数。
总结与推荐
方法
优点
缺点
适用场景
{dede:field} + function最简单、最官方、性能最好
功能相对固定,只能获取名称
绝大多数情况下的首选,尤其是在列表页和内容页中。
{dede:channel}可同时获取名称、链接等信息
需要手动知道上级栏目的ID
当上级栏目是固定的,并且你还需要它的链接时。
自定义函数
最灵活,可以处理复杂逻辑
需要修改PHP文件,有一定门槛,可能影响性能
当网站栏目结构非常特殊,官方函数无法满足需求时。
{dede:field.typename function='GetTopTypename(@me)'/},这是 DedeCMS 设计之初就考虑好的标准用法,简单、高效且可靠。
