在模板中获取当前栏目的顶级ID
这是最常见的需求,通常用于高亮顶级栏目导航、面包屑导航等。

(图片来源网络,侵删)
方法1:使用顶级栏目ID标签(最简单直接)
DedeCMS有一个专门的标签 {dede:field.typedir /},但它返回的是路径,更常用的是通过获取当前栏目的顶级ID。
在DedeCMS V5.7及更高版本中,可以直接使用以下标签:
{dede:field.typeid function="GetTopid(@me)"/}
解释:
{dede:field.typeid}:获取当前栏目的ID。function="GetTopid(@me)":这是一个自定义函数。@me代表field.typeid的值(即当前栏目ID)。GetTopid()函数会根据这个ID,向上查找并返回顶级栏目的ID。
示例:
假设当前栏目ID是 15,它属于一个ID为 5 的顶级栏目。{dede:field.typeid function="GetTopid(@me)"} 输出的结果就是 5。

(图片来源网络,侵删)
方法2:使用 channel 标签配合 typeid 属性
如果你想在循环中获取顶级ID,可以使用 channel 标签的 typeid 属性。
{dede:channel type='top' typeid='0'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
这个例子是获取所有顶级栏目,如果你想在某个特定栏目下获取其顶级ID,可以这样结合:
{dede:field name='typeid' runphp='yes'}
$topid = GetTopid(@me);
@me = $topid;
{/dede:field}
这段代码和第一种方法效果类似,但更灵活地结合了PHP。
在PHP代码中获取顶级栏目ID
如果你在自定义的PHP文件、模块或函数中需要获取顶级ID,可以直接调用DedeCMS的函数。
核心函数:GetTopid()
这个函数是获取顶级ID的关键,它的定义在 /include/common.func.php 文件中。
函数签名:
GetTopid($typeid)
参数:
$typeid:当前栏目的ID(整数)。
返回值:
- 返回顶级栏目的ID(整数)。
使用示例:
<?php // 引入DedeCMS的核心文件 // 通常在织梦的框架下,这个环境变量已经存在 // 如果是独立脚本,需要手动引入 // require_once(dirname(__FILE__).'/../include/common.inc.php'); // 假设当前栏目ID是 25 $currentTypeId = 25; // 调用函数获取顶级ID $topTypeId = GetTopid($currentTypeId); // 输出结果 echo "当前栏目ID: " . $currentTypeId . "<br>"; echo "顶级栏目ID: " . $topTypeId; // 输出顶级栏目的ID ?>
(文章)的顶级栏目ID
这个需求也很常见,比如在文章详情页,你想知道这篇文章所属的顶级栏目是什么,以便调用该顶级栏目下的其他文章。
方法1:在文章详情页模板中
模板(article_article.htm)中,你可以通过文章的栏目ID,再调用 GetTopid 函数来实现。
{dede:field name='typeid' runphp='yes'}
// @me 是当前文章的栏目ID
$topid = GetTopid(@me);
@me = $topid; // 将函数返回值赋给 @me
{/dede:field}
这样,你就可以在模板中像使用普通字段一样使用这个顶级ID了,
当前文章所属的顶级栏目ID是:{dede:field.name='typeid' runphp='yes'}$topid = GetTopid(@me);@me = $topid;{/dede:field}
方法2:在PHP代码中(例如自定义函数或修改PHP文件)
逻辑和场景二完全一样,只是 $typeid 的来源不同,你需要先获取到当前文章的栏目ID,然后再调用 GetTopid()。
<?php // 假设你通过某种方式获取到了当前文章的栏目ID // 从数据库查询得到,或者从URL参数获取 $currentTypeId = 30; // 假设文章属于ID为30的栏目 // 调用函数获取顶级ID $topTypeId = GetTopid($currentTypeId); // 现在你就可以使用 $topTypeId 了 echo "文章所属的顶级栏目ID是: " . $topTypeId; ?>
总结与注意事项
| 场景 | 推荐方法 | 代码/标签示例 |
|---|---|---|
| 模板中获取当前栏目顶级ID | 使用 GetTopid 函数 |
{dede:field.typeid function="GetTopid(@me)"} |
| PHP代码中获取任意栏目顶级ID | 调用 GetTopid($typeid) 函数 |
$topid = GetTopid(15); |
| 文章详情页获取顶级栏目ID | 先获取文章栏目ID,再用 GetTopid |
{dede:field.name='typeid' runphp='yes'}$topid = GetTopid(@me);@me = $topid;{/dede:field} |
重要提示:
- 函数位置:
GetTopid()函数位于/include/common.func.php,如果你的主题或插件修改了此文件,可能会导致函数不可用,请确保该文件存在且未被破坏。 - 栏目结构:
GetTopid()函数的逻辑是“向上查找父级,直到父级ID为0”,如果你的栏目结构非常复杂(例如多层嵌套),它依然能正确工作。 - 栏目类型:此方法仅适用于栏目,如果你想获取单页文档的顶级ID,逻辑会略有不同,因为单页文档本身就是一个栏目,但通常单页文档本身就是顶级,所以它的顶级ID就是它自己。
- 版本兼容性:
GetTopid()是一个非常核心和基础的函数,在DedeCMS的各个主流版本中都存在且功能一致,兼容性很好。
希望这个详细的解答能帮到你!
