使用系统内置的 GetPosition() 函数 (最推荐,最简单)
这是 DedeCMS 提供的最便捷、最标准的方法,它会自动生成类似 “首页 > 父栏目 > 当前栏目” 这样的路径。

(图片来源网络,侵删)
适用场景:
- 列表页 (
list_article_art.htm等) - 内容页 (
article_article.htm等) - 其他需要栏目路径的地方。
代码示例:
在模板文件中,直接使用以下标签即可:
{dede:field name='position'/}
示例效果:
如果你的网站结构是 首页 > 技术分享 > DedeCMS教程,那么在“DedeCMS教程”这个栏目或文章页使用 {dede:field.name='position'/},页面显示的就是:
首页 > 技术分享 > DedeCMS教程
如何只获取父级栏目名称?
GetPosition() 返回的是一个完整的路径字符串,如果你只想获取直接父级的栏目名称,需要结合 PHP 的字符串处理函数。
在列表页获取父级栏目名称:

(图片来源网络,侵删)
{dede:list}
<!-- 假设当前栏目的ID是 {dede:field.id/} -->
<?php
// 获取当前栏目的顶级栏目ID
$topid = GetTopid($typeid);
// 获取当前栏目的父级栏目ID
$parentid = $fields['reid'];
// 如果不是顶级栏目,则获取父级栏目名称
if ($parentid > 0) {
$row = $dsql->GetOne("SELECT typename FROM `dede_arctype` WHERE id = $parentid");
$parent_name = $row['typename'];
} else {
$parent_name = '顶级栏目';
}
?>
文章标题:{dede:field.title/}
父级栏目:<?php echo $parent_name; ?>
{/dede:list}
页获取父级栏目名称:**
页的变量可以直接使用 $this->Fields。
{dede:field.title/}
<?php
// 获取当前文章所在栏目的父级栏目ID
$typeid = $this->Fields['typeid'];
$parentid = $this->Fields['reid'];
if ($parentid > 0) {
$row = $dsql->GetOne("SELECT typename FROM `dede_arctype` WHERE id = $parentid");
$parent_name = $row['typename'];
} else {
$parent_name = '顶级栏目';
}
?>
当前文章的父级栏目是:<?php echo $parent_name; ?>
使用SQL直接查询数据库 (灵活可控)
当你需要更复杂的逻辑,或者不想依赖系统函数时,可以直接执行 SQL 查询。
适用场景:
- 任何需要获取父级栏目信息的自定义页面。
- 对查询结果有特殊处理需求时。
代码示例:
前提:
你需要知道当前栏目的 ID (在列表页是 $typeid页是 $this->Fields['typeid'])。
通用代码片段:
<?php
// 假设你已经获取了当前栏目的ID,$currentTypeId = 5;
$currentTypeId = $this->Fields['typeid']; // 在内容页中使用
// $currentTypeId = $typeid; // 在列表页循环中使用
if (!empty($currentTypeId)) {
// 查询当前栏目的信息
$currentType = $dsql->GetOne("SELECT reid, typename FROM `dede_arctype` WHERE id = $currentTypeId");
// reid 不为0,说明有父级栏目
if ($currentType['reid'] > 0) {
// 根据父级栏目ID查询父级栏目名称
$parentType = $dsql->GetOne("SELECT typename FROM `dede_arctype` WHERE id = " . $currentType['reid']);
$parent_name = $parentType['typename'];
echo "父级栏目是:" . $parent_name;
} else {
echo "这是顶级栏目";
}
}
?>
在PHP文件中处理 (适用于非模板文件)
如果你在 include 目录下的一个PHP文件或者一个自定义的PHP页面中需要获取父级栏目名称,方法类似,但需要先初始化DedeCMS环境。
适用场景:
- 自定义的PHP页面。
- 后台开发中。
代码示例:
<?php
require_once (dirname(__FILE__) . "/include/common.inc.php"); // 引入DedeCMS核心文件
// 假设当前栏目ID是 10
$currentTypeId = 10;
if (!empty($currentTypeId)) {
// 使用 $dsql 对象进行查询
$currentType = $dsql->GetOne("SELECT reid, typename FROM `dede_arctype` WHERE id = $currentTypeId");
if ($currentType['reid'] > 0) {
$parentType = $dsql->GetOne("SELECT typename FROM `dede_arctype` WHERE id = " . $currentType['reid']);
echo "栏目ID为 $currentTypeId 的父级栏目是:" . $parentType['typename'];
} else {
echo "栏目ID为 $currentTypeId 是顶级栏目。";
}
}
?>
总结与建议
| 场景 | 推荐方法 | 优点 | 缺点 |
|---|---|---|---|
| 列表页/内容页显示完整路径 | {dede:field.name='position'/} |
极其简单,官方标准,支持链接 | 无法直接获取单个父级名称 |
| 列表页/内容页获取单个父级名称 | 方法一 + PHP处理 | 结合了系统函数和灵活性 | 需要少量PHP代码 |
| 复杂查询或自定义页面 | 直接SQL查询 | 灵活,完全可控 | 需要手写SQL,代码稍多 |
| PHP文件中处理 | 初始化环境后查询 | 可在任何PHP脚本中使用 | 需要引入核心文件,不适合模板 |
对于绝大多数模板修改需求,强烈推荐使用方法一,因为它最安全、最符合DedeCMS的设计,如果只需要父级名称,再结合PHP进行简单的字符串处理或二次查询即可。
