页 (article_article.htm) 调用
这是最常见的情况,比如你在文章详情页,想显示这篇文章所属的栏目(父栏目)的名称。

(图片来源网络,侵删)
方法 1:使用全局变量 $typename (最简单、最推荐)
页模板中,DedeCMS 已经定义好了当前栏目的全局变量 $typename,这个变量存储的就是当前栏目的名称。
适用情况:
- 你只想显示当前栏目的名称,也就是这篇文章的直接上级栏目。
代码示例:
在你的 article_article.htm 模板文件中,在需要显示父级标题的地方直接使用:
<p>文章所属栏目:<strong>{dede:field name='typename'/}</strong></p>
或者使用变量:

(图片来源网络,侵删)
<p>文章所属栏目:<strong><?php echo $typename; ?></strong></p>
这两种写法效果是一样的。
方法 2:使用 GetTopTypename 自定义函数 (显示最顶级栏目)
如果你想在文章页显示这个栏目所属的最顶级栏目的名称,可以使用 DedeCMS 自带的函数 GetTopTypename。
适用情况:
- 你的栏目结构是“顶级栏目 > 二级栏目 > 三级栏目”。
- 你想在文章页直接显示“顶级栏目”的名称。
代码示例:
<p>文章所属顶级栏目:<strong>{dede:field name='typeid' function='GetTopTypename(@me)'/}</strong></p>
或者:
<p>文章所属顶级栏目:<strong><?php echo GetTopTypename($typeid); ?></strong></p>
这里的 $typeid 是当前文章的栏目 ID。
方法 3:手动查询数据库 (显示任意上级栏目)
如果你的栏目层级很深(比如四级、五级),或者你想显示“父级”栏目而不是“顶级”栏目,而 DedeCMS 又没有提供现成的函数,那么可以手动查询数据库。
适用情况:
- 栏目层级超过两级。
- 需要显示直接父级栏目,而不是顶级栏目。
代码示例: 假设你想获取当前栏目的直接父级栏目名称,可以在模板文件中加入 PHP 代码。
<?php
// 获取当前栏目的ID
$TypeID = $typeid;
// 如果当前栏目ID不为0(0表示是顶级栏目)
if($TypeID > 0){
// 查询当前栏目的信息
$query = "SELECT typename,reid FROM `#@__arctype` WHERE id = $TypeID";
$row = $dsql->GetOne($query);
// 如果父级栏目ID(reid)不为0,则查询父级栏目名称
if($row['reid'] != 0){
$ParentID = $row['reid'];
$parent_query = "SELECT typename FROM `#@__arctype` WHERE id = $ParentID";
$parent_row = $dsql->GetOne($parent_query);
$parent_typename = $parent_row['typename'];
} else {
$parent_typename = '这是顶级栏目';
}
}
?>
<p>文章的直接父级栏目是:<strong><?php echo $parent_typename; ?></strong></p>
代码解释:
$typeid是当前文章的栏目 ID。- 我们查询
#@__arctype表(栏目表)获取当前栏目的reid(父级栏目ID)和typename(当前栏目名)。 reid不为 0,说明它不是顶级栏目,我们再用reid去查询父级栏目的typename。- 最后输出结果。
在列表页 (list_*.htm) 调用
在列表页,情况类似,变量名稍有不同。
方法 1:使用全局变量 $typename
和文章页一样,$typename 在列表页模板中也代表当前栏目的名称。
代码示例:
在 list_x.htm 模板中:
<h2>当前栏目:<strong>{dede:field name='typename'/}</strong></h2>
方法 2:使用 GetTopTypename 函数
同样,可以使用 GetTopTypename 来获取顶级栏目名。
代码示例:
<h2>当前顶级栏目:<strong>{dede:field name='typeid' function='GetTopTypename(@me)'/}</strong></h2>
在首页或其他页面调用
在首页调用,需要通过 arclist 或 channel 标签来指定栏目,然后获取其父级信息。
方法:结合 channel 标签和 GetTopTypename
假设你想在首页显示“公司新闻”这个栏目的父级栏目名称。
代码示例:
假设“公司新闻”的栏目ID是 5。
{dede:channel typeid='5'}
<p>栏目“[field:typename/]”的顶级栏目是:<strong>{field:typename function='GetTopTypename(@me)'/}</strong></p>
{/dede:channel}
或者,如果你想获取它的直接父级,可以结合 PHP 代码(方法3)来实现,但会更复杂一些,通常首页调用只需要顶级栏目名就足够了。
总结与推荐
| 场景 | 需求 | 推荐方法 | 代码示例 |
|---|---|---|---|
| 文章页 | 显示当前栏目(直接上级) | 全局变量 $typename |
{dede:field.name='typename'/} |
| 文章页 | 显示最顶级栏目 | GetTopTypename 函数 |
{dede:field.name='typeid' function='GetTopTypename(@me)'/} |
| 文章页 | 显示任意上级栏目(如父级) | 手动查询数据库 | 见方法3,使用PHP代码查询reid |
| 列表页 | 显示当前栏目 | 全局变量 $typename |
{dede:field.name='typename'/} |
| 列表页 | 显示最顶级栏目 | GetTopTypename 函数 |
{dede:field.name='typeid' function='GetTopTypename(@me)'/} |
| 首页/其他页 | 调用指定栏目的上级 | channel + GetTopTypename |
{dede:channel typeid='X'}...{/dede:channel} |
核心要点:
$typename是获取当前栏目名称最简单直接的方式。GetTopTypename()是获取顶级栏目名称的利器。- 对于复杂的层级关系,手动查询数据库是最灵活但也是最复杂的方法,需要你对 PHP 和 DedeCMS 数据库结构有一定了解。
对于绝大多数情况,方法1和方法2已经足够解决。
