使用 GetTopTypename() 函数(最推荐、最简单)
这是织梦官方提供的、专门用于获取顶级栏目名称的函数,如果你需要获取当前栏目的顶级父级名称,这是最佳选择。

(图片来源网络,侵删)
语法:
<?php echo GetTopTypename($typeid); ?>
$typeid:当前栏目的ID,在列表页或内容页,这个变量通常可以直接使用{dede:field.id/}或{dede:global.artid/}获取。
适用场景:
- 在列表页 (
list_article.htm) 调用。 - 在内容页 (
article_article.htm) 调用。 - 在首页或其他自定义页面调用(需要知道当前栏目的ID)。
示例:
在列表页 (list_article.htm) 中调用
假设你的栏目结构是:首页 -> 技术文章 -> PHP教程,当你在 "PHP教程" 这个列表页时,想显示它的顶级父级 "技术文章" 的名称。
在列表页模板的相应位置加入以下代码:
<h2>当前位置:首页 > <strong>{dede:field.typename/}</strong></h2>
<p>本栏目隶属于顶级栏目:<strong><?php echo GetTopTypename($typeid); ?></strong></p>
{dede:field.typename/}会显示当前栏目的名称,即 "PHP教程"。GetTopTypename($typeid)会向上查找,直到找到顶级栏目,并返回其名称,即 "技术文章"。
页 (article_article.htm) 中调用
页,你想显示这篇文章所属栏目的顶级父级名称。
页模板的相应位置加入:

(图片来源网络,侵删)
<div class="breadcrumb">
首页 > <a href="{dede:field name='typelink'/}">{dede:field.typename/}</a>
</div>
<div class="info">
本文所属顶级栏目:<strong><?php echo GetTopTypename($GLOBALS['artid']); ?></strong>
</div>
```页,当前栏目的ID通常通过 `$GLOBALS['artid']` 获取,或者直接使用 `{dede:field.id/}`。
* `GetTopTypename()` 会根据文章ID找到它所在的栏目,然后返回该栏目的顶级父级名称。
---
### 方法二:使用 `{dede:field.typeid/}` 和 `GetOneType()` 函数(更灵活,可获取任意父级)
如果你需要获取**直接父级**的名称,或者更复杂的层级关系,可以使用这个方法,它需要结合PHP和织梦的数据查询函数。
#### 适用场景:
* 获取**直接父级**栏目名称。
* 获取**任意层级**的父级栏目名称。
#### 示例:
**1. 获取直接父级栏目名称**
假设你的栏目结构是:`首页 -> 技术文章 -> PHP教程`,在 "PHP教程" 列表页,你想显示它的直接父级 "技术文章" 的名称。
在列表页模板中加入以下代码:
```php
<?php
// 1. 获取当前栏目的ID
$currentTypeId = $typeid;
// 2. 获取当前栏目的完整信息
$currentType = GetOneType($currentTypeId);
// 3. 从当前栏目的信息中获取其父级ID
$parentId = $currentType['reid']; // 'reid' 字段存储的就是父级栏目的ID
// 4. 如果存在父级ID (reid不为0),则获取父级栏目的名称
if ($parentId > 0) {
$parentType = GetOneType($parentId);
$parentName = $parentType['typename'];
echo $parentName;
} else {
echo "这是顶级栏目";
}
?>
代码解释:
GetOneType($id):根据栏目ID获取该栏目的所有信息,返回一个数组。$currentType['reid']:这个数组中的reid键对应的值就是当前栏目的父级栏目ID。reid为0,则表示它本身就是顶级栏目。GetOneType($parentId):再次调用函数,用父级ID获取父级栏目的信息。$parentType['typename']:从父级信息数组中获取typename,即父级栏目的名称。
在首页或自定义页面调用(需指定栏目ID)
如果你想在首页的某个位置显示指定栏目(比如ID为5的栏目)的父级名称,可以这样写:
<?php
$targetTypeId = 5; // 你想查询的栏目的ID
$targetType = GetOneType($targetTypeId);
if ($targetType['reid'] > 0) {
$parentType = GetOneType($targetType['reid']);
echo "栏目ID为 {$targetTypeId} 的父级是:" . $parentType['typename'];
} else {
echo "栏目ID为 {$targetTypeId} 是顶级栏目";
}
?>
使用SQL直接查询(适用于高级用户)
如果你对SQL比较熟悉,也可以直接执行数据库查询来获取名称,这种方法性能最高,但可读性稍差。
示例:获取直接父级名称
<?php
$currentTypeId = $typeid; // 当前栏目ID
// 1. 先查出当前栏目的父级ID
$query = "SELECT reid FROM `#@__arctype` WHERE id = $currentTypeId";
$row = $dsql->GetOne($query);
$parentId = $row['reid'];
// 2. 如果有父级ID,再查出父级名称
if ($parentId > 0) {
$query2 = "SELECT typename FROM `#@__arctype` WHERE id = $parentId";
$row2 = $dsql->GetOne($query2);
echo $row2['typename'];
}
?>
代码解释:
$dsql是织梦的数据库操作对象。GetOne($sql)执行一条SQL查询并返回第一条结果。#@__是织梦的数据表前缀,如果你的前缀不是dede_,会自动替换成你设置的前缀。
总结与推荐
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
GetTopTypename() |
代码最简单,官方函数,稳定可靠 | 只能获取顶级父级,无法获取中间层级的父级 | 绝大多数情况下,这是你的首选,特别是只需要显示顶级分类时。 |
GetOneType() |
非常灵活,可以获取任意层级的父级,逻辑清晰 | 代码稍多,需要理解 reid 字段 |
需要显示直接父级或进行复杂层级判断时。 |
| SQL查询 | 性能最高 | 代码可读性差,不够“织梦化”,硬编码了表名 | 对性能有极致要求,且不介意写原生SQL的高级用户。 |
对于99%的需求,直接使用方法一 GetTopTypename() 就足够了,也是最规范和最容易维护的做法。
