使用SQL直接查询(最推荐、最灵活)
这是最直接、最可靠的方法,因为它不受栏目缓存或嵌套层级复杂性的影响,我们可以在内容页模板文件(通常是 article_article.htm)中直接执行SQL查询。

操作步骤:
- 打开你的内容页模板文件,路径通常是:
/templets/default/article_article.htm。 - 在你需要调用顶级栏目信息的地方(在
{dede:field name='title'/}标题下方),插入以下PHP代码块。
代码示例:
{dede:sql sql='SELECT * FROM `dede_arctype` WHERE id=(SELECT topid FROM `dede_arctype` WHERE id=~id~)'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:sql}
代码解析:
{dede:sql sql=''}: 这是织梦的SQL标签,用于执行自定义的SQL查询。SELECT * FROM dede_arctype: 我们要从数据表dede_arctype(栏目表)中查询所有字段。 表示所有字段,你也可以只查询你需要的字段,如id, typename, typelink。WHERE id=(...): 这是查询条件,我们要找的顶级栏目的id等于括号内查询结果。SELECT topid FROM dede_arctype WHERE id=~id~: 这是一个子查询。~id~: 这是织梦内容页模板中的一个特殊变量,它会被自动替换为当前文章所在栏目的ID,这是实现动态关联的关键。- 这行子查询的意思是:“找到当前文章所在栏目的
id,然后去dede_arctype表里查询这个id对应栏目的topid(顶级栏目ID)”。
[field:typelink/]: 在{dede:sql}标签内部,可以使用[field:字段名/]来输出查询结果。typename: 栏目名称。typelink: 栏目链接(织梦会自动处理)。id: 栏目ID。description: 栏目描述。- 等等...
进阶用法:如果你想把顶级栏目信息存入变量以便多次使用

{dede:sql sql='SELECT typename, typelink, id FROM `dede_arctype` WHERE id=(SELECT topid FROM `dede_arctype` WHERE id=~id~)'}
{dede:getsql sql='SELECT typename, typelink, id FROM `dede_arctype` WHERE id=(SELECT topid FROM `dede_arctype` WHERE id=~id~)' assign='topCate'}
{/dede:sql}
<!-- 现在你可以通过 $topCate 变量来调用顶级栏目的信息了 -->
<p>顶级栏目名称:{$topCate.typename}</p>
<a href="{$topCate.typelink}">返回顶级栏目</a>
注意:{dede:getsql} 标签可以将查询结果赋值给一个PHP变量,assign='topCate' 就是定义变量名为 $topCate。
修改 include/common.func.php 文件(最规范、可复用)
如果你在网站的很多地方都需要调用顶级栏目,那么创建一个自定义函数是最好的选择,这符合“代码复用”的原则。
操作步骤:
- 打开织梦核心函数文件:
/include/common.func.php。 - 在文件末尾
?>之前,添加以下PHP函数:
/**
* 获取指定栏目的顶级栏目信息
* @param int $typeid 栏目ID
* @return array 顶级栏目信息数组
*/
function GetTopType($typeid)
{
global $dsql;
if (empty($typeid)) {
return false;
}
// 先获取当前栏目的顶级栏目ID
$row = $dsql->GetOne("SELECT topid FROM `#@__arctype` WHERE id = $typeid");
$topid = $row['topid'];
// 如果当前栏目就是顶级栏目,则topid为0,此时typeid就是顶级栏目ID
if ($topid == 0) {
$topid = $typeid;
}
// 获取顶级栏目的完整信息
$topType = $dsql->GetOne("SELECT id, typename, typelink FROM `#@__arctype` WHERE id = $topid");
return $topType;
}
注意:代码中的 #@__ 是织梦表前缀的占位符,系统会自动替换为你数据库中配置的前缀(如 dede_)。

- 在模板中调用这个函数:
你可以在任何模板文件(包括内容页)中使用这个函数了。
{dede:getsql sql='GetTopType(~id~)' assign='topCate'/}
<!-- 使用变量输出 -->
当前文章的顶级栏目是:<a href="{$topCate.typelink}">{$topCate.typename}</a>
<!-- 或者直接调用,输出名称 -->
顶级栏目名:{dede:function name='GetTopType' row=~id~ field='typename'/}
GetTopType(~id~): 调用我们刚刚创建的函数,并将当前文章的栏目ID~id~传进去。row=~id~:row参数用于向函数传递参数。field='typename':field参数用于指定只返回函数结果中的typename字段。
优点:
- 代码复用:一次定义,处处可用。
- 逻辑清晰:将数据库查询逻辑与模板分离,更易于维护。
- 性能较好:函数经过优化,效率很高。
利用 channel 标签(适用于特定层级)
如果你的栏目结构不复杂(比如最多三级),并且顶级栏目就是当前栏目的父栏目的父栏目,你可以尝试使用 操作步骤:
页模板中,使用 这种方法本质上和方法二类似,但不如方法二灵活和强大,不推荐作为首选,但可以了解一下。 这种方法需要依赖自定义函数,所以最终还是回到了方法二。 最终建议:{dede:channel}
{dede:field name='typeid' function="GetTopType(@me)"/} 这样的方式来获取顶级栏目ID。
2. 然后用这个ID去查询栏目信息。{dede:channel type='top' row='1' currentstyle=''}
<!-- 这个标签通常用于调用顶级栏目列表,而不是单个 -->
{/dede:channel}
<!-- 更实际的用法是结合PHP -->
<?php
$topid = (int)GetTopType($arcID)['id']; // 假设你已经在common.func.php里定义了GetTopType函数
?>
{dede:channel typeid='$topid' row='1'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
总结与对比
方法
优点
缺点
推荐度
SQL直接查询
- 简单直接,无需修改核心文件。
- 灵活,可随时修改SQL获取不同字段。
- 不受栏目层级限制。- 如果在多处使用,代码会重复。
- SQL语句直接写在模板中,对初学者可能不够直观。⭐⭐⭐⭐⭐ (最常用,快速实现)
自定义函数
- 最规范、最专业的做法。
- 高度复用,一劳永逸。
- 逻辑与视图分离,易于维护和扩展。
- 性能优秀。- 需要修改核心函数文件
common.func.php,对新手有门槛。⭐⭐⭐⭐⭐ (最推荐,长期项目首选)
Channel标签
- 标签化,感觉“原生”。
- 不够灵活,实现复杂逻辑困难。
- 通常需要结合自定义函数,显得冗余。⭐⭐ (不推荐,了解即可)
