场景分析
我们需要明确“当前”指的是什么:

(图片来源网络,侵删)
- 页 (
article_article.htm) 这是最常见的需求,你正在浏览一篇文章,想知道这篇文章所属的大类(顶级栏目)的链接。 - 在列表页或栏目页 (
article_list.htm,index.htm等) 你在一个列表页(公司新闻”列表页),想知道这个列表页本身所属的顶级栏目(关于我们”)的链接。
下面我将针对这两种场景,提供具体的代码。
使用 {dede:field} 标签(推荐,最简洁)
这种方法利用了 DedeCMS 的内置变量,代码最简洁,性能也最好。
适用于:文章内容页 (article_article.htm)
页模板中,可以直接使用 {dede:field.typeid} 获取当前栏目的ID,然后通过 GetTopTypelink 函数获取顶级栏目链接。
代码示例:

(图片来源网络,侵删)
<a href="{dede:field name='typeid' function='GetTopTypelink(@me)'/}" title="{dede:field.seotitle/}">
{dede:field name='typeid' function='GetTopTypelink(@me)'/}
</a>
代码解析:
{dede:field.name='typeid'}: 获取当前文章所在栏目的 ID (如果文章在“公司新闻”栏目下,这个值可能是 5)。function='GetTopTypelink(@me)': 这是关键。@me:代表{dede:field.name='typeid'}的值,也就是栏目ID 5。GetTopTypelink():这是一个 DedeCMS 的自定义PHP函数,它会接收一个栏目ID作为参数,然后返回这个栏目所属的 顶级栏目 的完整链接(<a href="...">栏目名</a>格式)。"{dede:field.seotitle/}"`: 为链接添加 SEO 标题,这是一个好习惯。
使用 {dede:global}
这种方法适用于列表页、首页等,可以获取当前栏目的顶级栏目信息。
适用于:列表页/栏目页 (article_list.htm)
在列表页模板中,当前栏目的ID可以通过 {dede:global.itemid/} 获取。
代码示例:
(图片来源网络,侵删)
<a href="{dede:global name='typeid' function='GetTopTypelink(@me)'/}" title="{dede:global.name='topid' function='GetTopInfos(@me, 'type', 'seotitle')'}">
{dede:global.name='typeid' function='GetTopTypelink(@me)'/}
</a>
代码解析:
{dede:global.name='typeid'}: 获取当前列表页所在栏目的ID。
function='GetTopTypelink(@me)': 同上,获取顶级栏目的链接。"..." 这里我们用了另一个函数GetTopInfos` 来动态获取顶级栏目的SEO标题,使代码更健壮。
使用 {dede:channel} 标签(适用于栏目列表)
如果你想在页面上显示一个包含所有顶级栏目的导航,并且希望当前顶级栏目高亮,可以使用 {dede:channel} 标签配合 currentstyle 属性。
这种方法虽然不是直接“调用当前顶级栏目链接”,但在实际应用中非常常见,能实现类似的效果。
代码示例:
{dede:channel type='top' currentstyle="<li class='thisclass'><a href='~typelink~'>~typename~</a></li>"}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
代码解析:
{dede:channel type='top' ...}: type='top' 表示只调用顶级栏目。
currentstyle="...": 这是一个强大的属性,如果当前页面所在的栏目是这个顶级栏目下的子栏目,那么这个顶级栏目的链接就会被 currentstyle 中的代码替换掉。
~typelink~: 会被替换为顶级栏目的链接。
~typename~: 会被替换为顶级栏目的名称。
- 默认情况下,如果不是当前顶级栏目,则显示
<li><a href="[field:typelink/]">[field:typename/]</a></li>。
自定义函数(最灵活)
如果以上方法不能满足你的复杂需求(比如你想获取顶级栏目的ID、名称、链接等多个信息),你可以自定义一个函数。
步骤 1:修改 include/helpers/extend.helper.php 文件
打开这个文件,在文件末尾 ?> 之前,添加如下自定义函数:
/**
* 获取当前顶级栏目的详细信息
* @param int $typeid 当前栏目ID
* @return array 返回包含顶级栏目信息的数组,包括 id, typename, typelink 等
*/
if ( ! function_exists('GetTopTypeInfos'))
{
function GetTopTypeInfos($typeid)
{
global $dsql;
$topInfos = array();
// 获取当前栏目的顶级栏目ID
$query = "SELECT topid FROM `#@__arctype` WHERE id = $typeid";
$row = $dsql->GetOne($query);
$topid = $row['topid'];
// 如果当前栏目就是顶级栏目,则topid为0
if ($topid == 0) {
$topid = $typeid;
}
// 获取顶级栏目的详细信息
$query2 = "SELECT id, typename, typedir, isdefault, ispart,
description, keywords, content,
(`modname`='default' || ISNULL(`modname`)) AS isdefault,
userip, uptime, mid, crossid, `rank`,
(ispart<>2 && ishidden<>1) AS ishidden
FROM `#@__arctype` WHERE id = $topid";
$row2 = $dsql->GetOne($query2);
if (is_array($row2)) {
$row2['typelink'] = GetOneTypeUrlA($row2); // 获取完整链接
return $row2;
}
return $topInfos;
}
}
步骤 2:在模板中调用
现在你可以在任何模板文件中调用这个函数,获取你想要的信息。
页 (article_article.htm) 示例:**
<!-- 获取顶级栏目链接 -->
顶级栏目链接: <a href="{dede:fieldtypeid function='GetTopTypeInfos(@me)["typelink"]'/}">点击进入</a>
<!-- 获取顶级栏目名称 -->
顶级栏目名称: {dede:fieldtypeid function='GetTopTypeInfos(@me)["typename"]'/}
<!-- 获取顶级栏目ID -->
顶级栏目ID: {dede:fieldtypeid function='GetTopTypeInfos(@me)["id"]'/}
代码解析:
{dede:fieldtypeid}: 获取当前栏目ID。
function='GetTopTypeInfos(@me)': 调用我们刚刚创建的函数,传入栏目ID,函数会返回一个包含所有顶级栏目信息的数组。
["typelink"], ["typename"], ["id"]: 从返回的数组中提取你需要的具体字段值。
总结与推荐
方法
适用场景
优点
缺点
{dede:field} + GetTopTypelink
页 (最推荐)
代码最简洁,性能高,专门为此场景设计。
功能单一,只能获取链接。
{dede:global} + GetTopTypelink
列表页/首页
代码简洁,适用于非文章页。
需要理解全局变量的概念。
{dede:channel}
需要显示顶级栏目导航时
功能强大,可轻松实现高亮等样式效果。
不是直接调用“当前”顶级栏目,而是循环所有。
自定义函数
需要获取顶级栏目多个信息时
最灵活,可获取ID、名称、链接、描述等任何信息。
需要修改核心文件,对新手有一定门槛。
对于绝大多数情况,方法一 ({dede:field name='typeid' function='GetTopTypelink(@me)'}) 是在文章内容页调用当前顶级栏目链接的最佳选择。
这种方法适用于列表页、首页等,可以获取当前栏目的顶级栏目信息。
适用于:列表页/栏目页 (article_list.htm)
在列表页模板中,当前栏目的ID可以通过 {dede:global.itemid/} 获取。
代码示例:

(图片来源网络,侵删)
<a href="{dede:global name='typeid' function='GetTopTypelink(@me)'/}" title="{dede:global.name='topid' function='GetTopInfos(@me, 'type', 'seotitle')'}">
{dede:global.name='typeid' function='GetTopTypelink(@me)'/}
</a>
代码解析:
{dede:global.name='typeid'}: 获取当前列表页所在栏目的ID。function='GetTopTypelink(@me)': 同上,获取顶级栏目的链接。"..."这里我们用了另一个函数GetTopInfos` 来动态获取顶级栏目的SEO标题,使代码更健壮。
使用 {dede:channel} 标签(适用于栏目列表)
如果你想在页面上显示一个包含所有顶级栏目的导航,并且希望当前顶级栏目高亮,可以使用 {dede:channel} 标签配合 currentstyle 属性。
这种方法虽然不是直接“调用当前顶级栏目链接”,但在实际应用中非常常见,能实现类似的效果。
代码示例:
{dede:channel type='top' currentstyle="<li class='thisclass'><a href='~typelink~'>~typename~</a></li>"}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
代码解析:
{dede:channel type='top' ...}:type='top'表示只调用顶级栏目。currentstyle="...": 这是一个强大的属性,如果当前页面所在的栏目是这个顶级栏目下的子栏目,那么这个顶级栏目的链接就会被currentstyle中的代码替换掉。~typelink~: 会被替换为顶级栏目的链接。~typename~: 会被替换为顶级栏目的名称。
- 默认情况下,如果不是当前顶级栏目,则显示
<li><a href="[field:typelink/]">[field:typename/]</a></li>。
自定义函数(最灵活)
如果以上方法不能满足你的复杂需求(比如你想获取顶级栏目的ID、名称、链接等多个信息),你可以自定义一个函数。
步骤 1:修改 include/helpers/extend.helper.php 文件
打开这个文件,在文件末尾 ?> 之前,添加如下自定义函数:
/**
* 获取当前顶级栏目的详细信息
* @param int $typeid 当前栏目ID
* @return array 返回包含顶级栏目信息的数组,包括 id, typename, typelink 等
*/
if ( ! function_exists('GetTopTypeInfos'))
{
function GetTopTypeInfos($typeid)
{
global $dsql;
$topInfos = array();
// 获取当前栏目的顶级栏目ID
$query = "SELECT topid FROM `#@__arctype` WHERE id = $typeid";
$row = $dsql->GetOne($query);
$topid = $row['topid'];
// 如果当前栏目就是顶级栏目,则topid为0
if ($topid == 0) {
$topid = $typeid;
}
// 获取顶级栏目的详细信息
$query2 = "SELECT id, typename, typedir, isdefault, ispart,
description, keywords, content,
(`modname`='default' || ISNULL(`modname`)) AS isdefault,
userip, uptime, mid, crossid, `rank`,
(ispart<>2 && ishidden<>1) AS ishidden
FROM `#@__arctype` WHERE id = $topid";
$row2 = $dsql->GetOne($query2);
if (is_array($row2)) {
$row2['typelink'] = GetOneTypeUrlA($row2); // 获取完整链接
return $row2;
}
return $topInfos;
}
}
步骤 2:在模板中调用
现在你可以在任何模板文件中调用这个函数,获取你想要的信息。
页 (article_article.htm) 示例:**
<!-- 获取顶级栏目链接 -->
顶级栏目链接: <a href="{dede:fieldtypeid function='GetTopTypeInfos(@me)["typelink"]'/}">点击进入</a>
<!-- 获取顶级栏目名称 -->
顶级栏目名称: {dede:fieldtypeid function='GetTopTypeInfos(@me)["typename"]'/}
<!-- 获取顶级栏目ID -->
顶级栏目ID: {dede:fieldtypeid function='GetTopTypeInfos(@me)["id"]'/}
代码解析:
{dede:fieldtypeid}: 获取当前栏目ID。function='GetTopTypeInfos(@me)': 调用我们刚刚创建的函数,传入栏目ID,函数会返回一个包含所有顶级栏目信息的数组。["typelink"],["typename"],["id"]: 从返回的数组中提取你需要的具体字段值。
总结与推荐
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
{dede:field} + GetTopTypelink |
页 (最推荐) | 代码最简洁,性能高,专门为此场景设计。 | 功能单一,只能获取链接。 |
{dede:global} + GetTopTypelink |
列表页/首页 | 代码简洁,适用于非文章页。 | 需要理解全局变量的概念。 |
{dede:channel} |
需要显示顶级栏目导航时 | 功能强大,可轻松实现高亮等样式效果。 | 不是直接调用“当前”顶级栏目,而是循环所有。 |
| 自定义函数 | 需要获取顶级栏目多个信息时 | 最灵活,可获取ID、名称、链接、描述等任何信息。 | 需要修改核心文件,对新手有一定门槛。 |
对于绝大多数情况,方法一 ({dede:field name='typeid' function='GetTopTypelink(@me)'}) 是在文章内容页调用当前顶级栏目链接的最佳选择。
