使用 GetTopTypename() 函数(最推荐,最简洁)
这是DedeCMS官方提供的专门用于获取顶级栏目名称的函数,也是最简单、最稳定的方法,它直接返回顶级栏目的名称字符串。

(图片来源网络,侵删)
适用场景:绝大多数情况下,直接获取名称字符串即可。
代码示例:
页模板文件(通常是 article_article.htm)中,在需要显示顶级栏目名称的地方,加入以下代码:
{dede:field.typeid function="GetTopTypename(@me)" /}
代码解析:
{dede:field.typeid}:这是获取当前文章所属的栏目ID。typeid是一个字段,存储的就是栏目ID。function="GetTopTypename(@me)":这是一个函数调用。@me:代表{dede:field.typeid}当前获取到的值(也就是栏目ID)。GetTopTypename():这是DedeCMS的核心函数,它会接收一个栏目ID作为参数,然后查询数据库,返回该ID对应的顶级栏目的名称。
使用SQL直接查询(更灵活,可获取更多信息)
如果你不仅需要顶级栏目的名称,还需要它的链接(URL)、ID等其他信息,使用SQL查询会更灵活。

(图片来源网络,侵删)
适用场景:需要获取顶级栏目的多个属性,如名称、链接、ID等。
代码示例:
页模板中,使用 {dede:sql} 标签进行数据库查询。
{dede:sql sql="SELECT typename,typedir FROM dede_arctype WHERE id=(SELECT topid FROM dede_arctype WHERE id=~typeid~)"}
<a href="[field:typedir function='str_replace("{cmspath}","",@me)'/]">[field:typename/]</a>
{/dede:sql}
代码解析:
-
内层查询
SELECT topid FROM dede_arctype WHERE id=~typeid~:
(图片来源网络,侵删)~typeid~:这是DedeCMS模板中的一个特殊全局变量,等同于当前文章的栏目ID,比@me更直接。- 这句查询的目的是:根据当前文章的栏目ID,找到它直接父栏目的ID(
topid字段)。
-
外层查询
SELECT typename,typedir FROM dede_arctype WHERE id=(...)):- 将内层查询得到的结果(即父栏目的ID)作为
WHERE条件。 topid字段存储的就是顶级栏目的ID,所以这句查询最终会获取到顶级栏目的名称(typename)和目录(typedir)。
- 将内层查询得到的结果(即父栏目的ID)作为
-
输出部分:
[field:typedir ...]:获取顶级栏目的目录路径。function='str_replace("{cmspath}","",@me)':这是一个非常重要的处理。typedir字段里通常包含{cmspath}这个占位符(代表你的网站根目录),需要将它替换掉,才能得到正确的URL。[field:typename/]:获取顶级栏目的名称。
通过JavaScript调用(适用于特定布局)
你可能希望在页面加载后,通过JavaScript来动态设置顶级栏目名称,例如在某个特定的<div>或<span>中。
适用场景:需要将栏目名称动态插入到非标准模板位置,或者与前端JS框架联动。
代码示例:
在模板的 <head> 部分或底部,加入以下JS代码:
<script>
// 获取当前文章的顶级栏目名称
function getTopTypeName() {
// 调用DedeCMS的全局函数,需要确保页面已加载DedeCMS的核心JS(通常不需要)
// 这里我们通过AJAX请求一个专门的处理页面来获取,或者直接在模板里输出一个JS变量
// 方式一:直接在模板里定义一个JS变量(推荐)
// 在模板的PHP部分(需要修改PHP文件或在模板里用PHP标签)获取名称并赋值给JS变量
// 在模板里可以这样(需要开启PHP支持):
// <script>
// var topTypeName = "<?php echo GetTopTypename($typeid); ?>";
// document.getElementById('top-cat-name').innerText = topTypeName;
// </script>
// 方式二:如果模板支持直接调用(较新的版本或开启相应支持)
// var topTypeName = "{dede:field.typeid function='GetTopTypename(@me)'}";
// document.getElementById('top-cat-name').innerText = topTypeName;
}
// 页面加载完成后执行
window.onload = function() {
// 假设你有一个id为"top-cat-name"的元素
var nameElement = document.getElementById('top-cat-name');
if (nameElement) {
// 调用DedeCMS的全局函数(如果可用)
// 注意:这个全局函数名可能因版本而异,不一定可靠
// var topName = GetTopTypename(document.getElementById('typeid').value);
// 更可靠的方式是方法一的PHP输出
nameElement.innerText = "顶级栏目名称"; // 这里需要替换为实际获取逻辑
}
};
</script>
<!-- 在模板的某个位置放置一个元素用于显示 -->
<span id="top-cat-name"></span>
注意:方法三相对复杂,依赖于PHP在模板中的执行或JS环境,不如前两种方法稳定和常用,通常只在有特殊前端交互需求时才考虑。
总结与对比
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
GetTopTypename() |
代码最简洁、最稳定、性能最好,是官方推荐用法。 | 只能获取名称,无法直接获取链接等其他信息。 | ★★★★★ (首选) |
| SQL查询 | 非常灵活,可以一次性获取顶级栏目的名称、链接、ID等所有信息。 | 代码稍长,需要理解SQL语句,对不熟悉SQL的用户有一定门槛。 | ★★★★☆ (需要链接时) |
| JavaScript | 灵活性高,适合复杂的前端动态交互。 | 依赖JS环境,实现复杂,稳定性不如前两种,需要额外处理。 | ★★☆☆☆ (特定场景) |
最终建议:
- 如果只是显示顶级栏目的名称,请毫不犹豫地使用 方法一
{dede:field.typeid function="GetTopTypename(@me)" /}。 - 如果除了名称,还需要生成一个指向顶级栏目的链接,请使用 方法二 的SQL查询方法,它能同时获取
typename和typedir,非常方便。
