这里为您提供几种最常用和最可靠的方法,从简单到复杂,并附上详细说明。

核心原理
织梦CMS的栏目数据存储在 #@_arctype 数据表中,要获取父栏目信息,我们需要通过当前栏目的 topid (顶级栏目ID)、reid (父栏目ID) 或 typename (栏目名称) 等字段来查询。
在列表页(栏目页)调用父栏目信息
这是最常见的情况,你希望在 list_article_*.php 页面显示当前栏目的父栏目名称和链接。
步骤 1:修改列表页模板文件
打开你当前栏目使用的列表页模板文件,路径通常是 /templets/default/list_article_*.php ( 是数字)。
步骤 2:在模板中添加调用代码
在需要显示父栏目信息的位置,加入以下代码。

代码示例:
{dede:field name='typename' function='GetParentTop(@me,1)'/}
或者,如果你想同时获取父栏目的名称和链接,可以这样写:
<a href="{dede:field name='typeid' function='GetParentTopUrl(@me,1)'/}">{dede:field name='typename' function='GetParentTop(@me,1)'/}</a>
代码详解
这里我们使用了两个自定义函数:GetParentTop 和 GetParentTopUrl,这两个函数默认不存在于织梦系统中,你需要将其添加到系统函数库中才能使用。
步骤 3:添加自定义函数到系统
- 打开织梦CMS的核心文件
/include/common.func.php。 - 在文件末尾的
?>之前,添加以下两段代码:
获取父栏目的名称

/**
* 获取指定栏目的父栏目名称
* @param int $typeid 当前栏目ID
* @param int $step 向上查找的级数,1为直接父栏目,2为父父栏目,以此类推
* @return string 父栏目名称
*/
function GetParentTop($typeid, $step = 1) {
global $dsql;
$row = $dsql->GetOne("SELECT * FROM `#@_arctype` WHERE `id` = $typeid");
if ($row['reid'] == 0) {
return $row['typename']; // 如果是顶级栏目,则返回自身名称
}
$reid = $row['reid'];
for ($i = 0; $i < $step; $i++) {
$parentRow = $dsql->GetOne("SELECT * FROM `#@_arctype` WHERE `id` = $reid");
if ($parentRow['reid'] == 0) {
return $parentRow['typename'];
}
$reid = $parentRow['reid'];
}
return '';
}
获取父栏目的链接
/**
* 获取指定栏目的父栏目链接
* @param int $typeid 当前栏目ID
* @param int $step 向上查找的级数,1为直接父栏目,2为父父栏目,以此类推
* @return string 父栏目链接
*/
function GetParentTopUrl($typeid, $step = 1) {
global $dsql;
$row = $dsql->GetOne("SELECT * FROM `#@_arctype` WHERE `id` = $typeid");
if ($row['reid'] == 0) {
return GetOneTypeUrlA($row); // 如果是顶级栏目,则返回自身链接
}
$reid = $row['reid'];
for ($i = 0; $i < $step; $i++) {
$parentRow = $dsql->GetOne("SELECT * FROM `#@_arctype` WHERE `id` = $reid");
if ($parentRow['reid'] == 0) {
return GetOneTypeUrlA($parentRow);
}
$reid = $parentRow['reid'];
}
return '';
}
- 保存并关闭
/include/common.func.php文件。
如何使用:
{dede:field name='typeid'}:获取当前栏目的ID。function='GetParentTop(@me,1)':调用GetParentTop函数,将当前栏目ID (@me) 作为第一个参数传入,1表示获取其直接父栏目。function='GetParentTopUrl(@me,1)':同理,获取直接父栏目的链接。
页(文章页)调用父栏目信息
页 (article_*.php) 调用父栏目信息,原理和列表页完全一样,只是获取当前栏目ID的方式不同。
步骤 1:修改内容页模板文件
打开 /templets/default/article_*.php 文件。
步骤 2:在模板中添加调用代码
和方法一中的代码完全相同。
<a href="{dede:field name='typeid' function='GetParentTopUrl(@me,1)'/}">{dede:field name='typename' function='GetParentTop(@me,1)'/}</a>
区别说明:
在列表页,{dede:field name='typeid'} 获取的是当前列表页面对应的栏目ID,页,{dede:field name='typeid'} 获取的是这篇文章所属的栏目ID。
由于我们在步骤3中已经添加了必要的函数,所以这里可以直接复用。
使用原生SQL标签(不推荐修改核心文件)
如果你不想修改 /include/common.func.php 文件,可以使用织梦的 dede:sql 标签直接查询数据库,但这种方法稍显复杂,且灵活性较差。
示例代码(在列表页或内容页使用):
{dede:sql sql="SELECT typename FROM `#@_arctype` WHERE id = (SELECT reid FROM `#@_arctype` WHERE id = ~typeid~)"}
<a href="[field:phpurl/]/list.php?tid=[field:id/]">[field:typename/]</a>
{/dede:sql}
代码说明:
~typeid~:这是织梦SQL标签中的一个特殊占位符,会自动被替换为当前栏目的ID。- 内层的
SELECT reid FROM ...先找到当前栏目的父栏目ID (reid)。 - 外层的
SELECT typename FROM ...再根据这个父栏目ID找到它的名称。 [field:phpurl/]:获取网站根目录地址。[field:id/]:获取查询结果中父栏目的ID。[field:typename/]:获取查询结果中父栏目的名称。
缺点:
- 代码冗长,不易读。
- 如果父栏目不存在,可能会产生错误。
- 需要手动拼接链接,不如方法一的函数灵活。
总结与推荐
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
| 方法一(添加自定义函数) | 代码简洁、可复用、灵活 | 需要修改核心文件 common.func.php |
强烈推荐,适用于列表页和内容页,是织梦二次开发的最佳实践。 |
| 方法二(原生SQL标签) | 不需要修改核心文件 | 代码冗长、灵活性差、可读性低 | 不推荐,仅在无法修改核心文件的特殊情况下考虑。 |
最终建议:
直接使用 方法一,虽然需要修改一个核心文件,但这是最规范、最稳定、最易于维护的解决方案,修改 common.func.php 是织梦二次开发中非常常见的操作,只要操作前备份一下原文件,就非常安全。
修改完成后,记得在后台 “生成” -> “更新HTML”,或者清空一下缓存,让新函数生效。
