页(article_article.htm)中获取父级栏目信息
这是最常见的需求,即在文章页面上显示该文章所属栏目的“父栏目”的名称和链接。

获取父级栏目名称
使用 GetTypeid 函数结合 GetOneTypeUrl 和 GetTypeInfo 函数。
代码示例:
{dede:field name='typeid' function="GetTopid(@me)"/}
代码解释:
{dede:field name='typeid'}: 获取当前文章所在的栏目ID。function="GetTopid(@me)": 这是关键。GetTopid()是DedeCMS的一个内置函数,它会接收一个栏目ID,然后返回其顶级栏目的ID,如果你的栏目结构是“顶级栏目 > 二级栏目 > 三级栏目”,而文章在三级栏目下,这个函数会返回顶级栏目的ID。
如果你想要获取直接父级栏目ID(而不是顶级栏目),你需要使用自定义函数,请参考下面的【进阶方法】。

获取父级栏目链接
在获取到父级栏目ID后,我们可以使用 GetOneTypeUrl 函数来生成它的链接。
代码示例:
{dede:field name='typeid' function="GetOneTypeUrl(GetTopid(@me))"/}
代码解释:
GetOneTypeUrl(): 这个函数接收一个栏目ID,并返回该栏目的完整链接地址。GetTopid(@me): 先获取顶级栏目ID,然后将这个ID传递给GetOneTypeUrl,最终得到顶级栏目的链接。
在列表页(list_*.htm)中获取父级栏目信息
在列表页,当前栏目就是列表本身,所以获取的是当前栏目的父级信息。

获取父级栏目名称
在列表页模板中,可以直接使用 {dede:field.typename/} 获取当前栏目名称,要获取父级栏目名称,同样需要用到 GetTopid 函数。
代码示例:
{dede:field.typeid function="GetTopid(@me)"/}
或者,如果你想获取当前栏目的直接父级ID,同样需要自定义函数(见下文)。
获取父级栏目链接
与文章页类似,使用 GetOneTypeUrl 函数。
代码示例:
{dede:field.typeid function="GetOneTypeUrl(GetTopid(@me))"/}
进阶方法:获取“直接父级”而非“顶级”栏目
DedeCMS默认的 GetTopid 函数只能获取顶级栏目,如果你的栏目结构是“顶级 > 父级 > 当前”,而你只想获取“父级”的信息,就需要一个自定义函数。
步骤 1:创建自定义函数文件
- 打开你的DedeCMS网站根目录。
- 找到并打开
include/common.func.php文件。 - 在文件的末尾(
?>之前)添加以下PHP函数代码:
/**
* 获取指定栏目的直接父级栏目ID
* @param int $typeid 当前栏目ID
* @return int 父级栏目ID
*/
function GetParentID($typeid)
{
global $dsql;
$row = $dsql->GetOne("SELECT reid FROM `#@__arctype` WHERE id = $typeid");
return $row['reid'];
}
代码解释:
这个函数 GetParentID 接收一个栏目ID,然后查询数据库中的 #@__arctype 表,找到该栏目的 reid 字段值。reid 字段存储的就是该栏目的“父级栏目ID”。
步骤 2:在模板中使用自定义函数
现在你可以在任何模板文件中使用这个新函数了。
示例:在文章页获取直接父级栏目的名称和链接
假设文章所在栏目的ID是 10,它的直接父级栏目ID是 5。
获取父级栏目名称:
{dede:field.name='typeid' function='GetParentID(@me)'/}
这会输出父级栏目的ID 5,如果你想要名称,需要再套一层 GetTypeInfo。
{dede:field.name='typeid' function='GetTypeName(GetParentID(@me))'/}
(注意:GetTypeName 也是一个内置函数,通过ID获取栏目名称)
获取父级栏目链接:
{dede:field.name='typeid' function='GetOneTypeUrl(GetParentID(@me))'/}
综合应用实例
假设你想在文章页面包屑导航中,在“首页 > 当前栏目”之前加上“父栏目”,可以这样写:
在 article_article.htm 中:
<div class="breadcrumb">
<a href="{dede:global.cfg_basehost/}">首页</a>
{dede:field.typeid function="GetParentID(@me) runphp='yes'"}
if(@me > 0){
$row = GetOneTypeUrl(@me);
echo ' > <a href="'.$row.'">'.GetTypeName(@me).'</a>';
}
{/dede:field.typeid}
> <a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a>
> <span>{dede:field name='title'/}</span>
</div>
代码解释:
{dede:field.typeid function="GetParentID(@me) runphp='yes'"}: 获取当前文章的直接父级栏目ID,并开启PHP运行。if(@me > 0): 判断是否存在父级栏目,如果栏目是顶级栏目,@me(即父级ID) 为0,则不显示。$row = GetOneTypeUrl(@me);: 获取父级栏目的链接。echo ' > <a href="'.$row.'">'.GetTypeName(@me).'</a>';: 输出面包屑的父级部分,如> <a href="/parent/">父栏目名称</a>。
| 需求 | 方法 | 代码示例 |
|---|---|---|
| 获取顶级栏目ID | 使用内置函数 | {dede:field.name='typeid' function='GetTopid(@me)'/} |
| 获取顶级栏目链接 | 组合使用内置函数 | {dede:field.name='typeid' function='GetOneTypeUrl(GetTopid(@me))'/} |
| 获取直接父级栏目ID | 自定义函数 GetParentID |
{dede:field.name='typeid' function='GetParentID(@me)'/} |
| 获取直接父级栏目链接 | 组合自定义和内置函数 | {dede:field.name='typeid' function='GetOneTypeUrl(GetParentID(@me))'/} |
重要提示:
- 在修改
include/common.func.php文件前,务必备份原文件,以防出错。 - 如果你的网站开启了模板缓存,修改模板或函数文件后,需要到后台的“生成” -> “更新缓存”中刷新缓存才能看到效果。
希望这些详细的解释和示例能帮助你解决问题!
