使用全局变量(最简单、最推荐)
这是最直接、最简单的方法,适用于列表页和内容页,DedeCMS在解析页面时,已经将当前栏目的信息加载到了全局变量中。

(图片来源网络,侵删)
在列表页 (list_*.php) 和内容页 (article_*.php) 中
DedeCMS的全局变量 $typearr 包含了当前栏目的完整层级信息。
- 顶级栏目ID:
$typearr['topid'] - 顶级栏目名称:
$typearr['topname']
示例代码:
{dede:field name='typename'/} <!-- 这是当前栏目的名称 -->
<br>
顶级栏目名称是:{dede:field name='topname'/}
使用场景:
- 在列表页模板
list_*.php中,直接使用{dede:field.name/}和{dede:field.topname/}。 - 页模板
article_*.php中,同样可以直接使用这两个标签。
优点:

(图片来源网络,侵删)
- 代码极其简单,性能最好。
- 无需任何额外查询,直接调用已加载的变量。
使用SQL查询(最灵活、最强大)
当你需要在更复杂的环境中,比如一个自定义的PHP文件或者一个特定位置的标签中调用时,SQL查询是最灵活的方法。
基本思路
- 获取当前栏目的ID。
- 通过当前栏目ID,查询其顶级栏目的ID。
- 再通过顶级栏目ID,查询其名称。
在列表页或内容页中使用
我们可以通过 typeid 变量获取当前栏目ID。
示例代码 (在模板中直接写PHP):
<?php // 1. 获取当前栏目ID $TypeID = $typeid; // 2. 查询顶级栏目ID // $dsql 是DedeCMS的全局数据库连接对象 // 从 `dede_arctype` 表中查询,顶级栏目的 `topid` 字段为0 $TopIDQuery = "SELECT id FROM `dede_arctype` WHERE id IN (SELECT topid FROM dede_arctype WHERE id=$TypeID) AND topid=0"; $TopIDRow = $dsql->GetOne($TopIDQuery); $TopID = $TopIDRow['id']; // 3. 查询顶级栏目名称 $TopNameQuery = "SELECT typename FROM `dede_arctype` WHERE id=$TopID"; $TopNameRow = $dsql->GetOne($TopNameQuery); $TopName = $TopNameRow['typename']; // 4. 输出 echo $TopName; ?>
简化版的SQL查询 (一步到位):

(图片来源网络,侵删)
<?php
$TypeID = $typeid;
// 使用子查询,先找到顶级ID,再根据顶级ID找到名称
$TopNameRow = $dsql->GetOne("SELECT typename FROM `dede_arctype` WHERE id=(SELECT topid FROM dede_arctype WHERE id=$TypeID) AND topid=0");
echo $TopNameRow['typename'];
?>
在自定义PHP文件中使用
如果你在 include/ 目录下创建了一个自定义的PHP文件,你需要先引入DedeCMS的核心文件,然后才能使用 $dsql 和其他全局变量。
示例代码 (custom_function.php):
<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");
// 假设我们通过GET参数传递栏目ID
if(isset($_GET['typeid'])) {
$TypeID = intval($_GET['typeid']);
// 查询顶级栏目名称
$TopNameRow = $dsql->GetOne("SELECT typename FROM `dede_arctype` WHERE id=(SELECT topid FROM dede_arctype WHERE id=$TypeID) AND topid=0");
if(is_array($TopNameRow)) {
echo "顶级栏目名称是:" . $TopNameRow['typename'];
} else {
echo "未找到顶级栏目";
}
} else {
echo "请提供栏目ID (typeid)";
}
?>
访问方式: 你的域名/dede/include/custom_function.php?typeid=5
优点:
- 灵活性极高,不受模板标签限制。
- 可以在任何PHP代码环境中使用。
使用自定义函数(最规范、最推荐用于复杂逻辑)
如果你需要在模板中多次使用这个功能,或者希望保持模板的整洁,最好的方式是创建一个自定义函数,然后在模板中调用。
创建自定义函数
在 include/common.func.php 文件的末尾添加以下PHP代码:
/**
* 根据栏目ID获取顶级栏目名称
* @param int $typeid 栏目ID
* @return string 顶级栏目名称
*/
function getTopTypeName($typeid) {
global $dsql;
if(empty($typeid)) return '';
// 使用更高效的JOIN查询
$row = $dsql->GetOne("SELECT typename FROM `dede_arctype` t1
LEFT JOIN `dede_arctype` t2 ON t1.id = t2.topid
WHERE t2.id = $typeid AND t1.topid = 0");
if(is_array($row)) {
return $row['typename'];
}
return '';
}
注意: 修改 common.func.php 文件前,请务必备份!这个文件是DedeCMS的核心公共函数文件。
在模板中调用
你可以在任何模板文件(列表页、内容页、首页等)中使用这个自定义函数了。
示例代码:
当前栏目ID是:{dede:field name='typeid'/}
<br>
顶级栏目名称是:{dede:gettopname function='getTopTypeName(@me)'/}
代码解释:
{dede:gettopname ...}是一个自定义的标签。function='getTopTypeName(@me)'的意思是,将@me替换为标签当前的内容,然后传递给getTopTypeName函数。@me会被{dede:field.name/}的值(即当前栏目ID)替换,然后调用getTopTypeName函数。
你也可以直接传递变量:
顶级栏目名称是:{dede:gettopname function='getTopTypeName(@me)'/}
然后在PHP代码中给这个标签赋值:
$tpl->Assign('typeid', $typeid);
优点:
- 代码逻辑与模板分离,非常规范。
- 可复用性强,定义一次,处处可用。
- 模板代码非常简洁,可读性高。
总结与对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 全局变量 | 最简单、性能最好 | 仅适用于列表页和内容页 | 绝大多数情况下的首选,尤其是在列表页和内容页中显示面包屑或标题时。 |
| SQL查询 | 最灵活、功能强大 | 代码稍复杂,需要懂PHP和SQL | 在自定义PHP文件、复杂标签或全局变量无法满足的特殊需求时使用。 |
| 自定义函数 | 最规范、最可复用 | 需要修改核心文件,对新手有一定门槛 | 当需要在多个地方调用,或者希望保持模板代码整洁、逻辑清晰时的最佳实践。 |
对于绝大多数用户和场景,强烈推荐使用方法一,如果需要更复杂的逻辑,再考虑方法三,因为它会让你的代码更易于维护。
