要调用三级栏目名,你需要使用织梦的循环标签 {dede:channel} 并配合 typeid 属性来指定栏目层级。

下面我将为你提供几种最常用和最有效的方法,从简单到复杂,并附上详细的代码示例。
核心思路
织梦的栏目数据存储在 dede_arctype 表中,每个栏目都有一个 topid(顶级ID)、reid(父级ID)和 id(自身ID)。
- 顶级栏目:
topid为 0。 - 二级栏目:
topid为其父级栏目的ID。 - 三级栏目:
topid为其顶级栏目的ID。
我们的目标是获取某个三级栏目路径,一级栏目 > 二级栏目 > 三级栏目。
在列表页或内容页调用当前栏目的三级路径(最常用)
这种方法适用于在列表页(list_article.htm)或内容页(article_article.htm)中,获取当前栏目所在的三级路径。

步骤 1:修改模板文件
打开你想要显示三级路径的模板文件,list_article.htm。
步骤 2:在合适的位置添加以下代码
将这段代码放在你希望显示路径的地方,<title> 标签内或面包屑导航中。
{dede:field name='title'/} - {[field:typename function='GetCatPath(@me)'/]}
或者,如果你想只显示路径,不显示当前栏目名:
{dede:field name='typename' function='GetCatPath(@me)'/}
步骤 3:在 include/extend.func.php 中添加自定义函数
这是最关键的一步,织梦的自定义函数都存放在这个文件里,如果文件不存在,请自行创建。

打开 /include/extend.func.php 文件,在文件末尾添加以下PHP代码:
/**
* 获取当前栏目的完整路径(一级栏目 > 二级栏目 > 三级栏目)
* @param int $typeid 当前栏目ID
* @return string 完整的栏目路径
*/
function GetCatPath($typeid) {
global $dsql;
$arr = array();
// 获取当前栏目的信息
$row = $dsql->GetOne("SELECT * FROM `dede_arctype` WHERE `id` = '$typeid'");
if (is_array($row)) {
// 将当前栏目名加入数组
$arr[] = $row['typename'];
// 如果有父级栏目,则递归获取父级栏目名
if ($row['reid'] > 0) {
$parentPath = GetCatPath($row['reid']);
if ($parentPath) {
$arr[] = $parentPath;
}
}
}
// 将数组反转,并拼接成字符串
$arr = array_reverse($arr);
return implode(' > ', $arr);
}
代码解释:
- 这个函数
GetCatPath接收一个参数$typeid,即当前栏目的ID。 - 它通过
global $dsql;获取数据库连接对象。 GetOne查询当前栏目的所有信息。- 将当前栏目的
typename(栏目名)存入一个数组$arr。 - 判断当前栏目是否有父级(
reid > 0),如果有,就递归调用自身,去获取父级栏目的路径。 - 递归结束后,
$arr数组里存储的是[三级栏目名, 二级栏目名, 一级栏目名]的顺序。 - 使用
array_reverse将数组反转,变成[一级栏目名, 二级栏目名, 三级栏目名]。 - 最后用
implode(' > ', $arr)将数组元素用>连接起来,形成最终的路径字符串。
步骤 4:更新缓存并测试
保存所有修改的文件后,登录织梦后台,点击“生成” -> “更新主页HTML” 或 “更新栏目HTML”,然后去对应的列表页或内容页查看效果。
在首页调用指定三级栏目的名称
如果你想在首页( 假设你知道你的三级栏目的ID是 代码解释: 注意:这种方法硬编码了栏目ID,如果栏目结构发生变化,就需要手动修改模板,适用于栏目结构非常固定的情况。 如果你想首页上展示网站中所有的三级栏目及其链接,可以使用更复杂的嵌套循环。 代码解释: 这种方法会生成一个完整的三级栏目树状菜单。 对于绝大多数情况,方法一是最佳选择,它既强大又灵活,是织梦开发中处理多级栏目路径的“标准答案”。index.htm)或任何其他页面调用一个固定的三级栏目名称,可以直接使用嵌套的 {dede:channel}
25,它的二级栏目ID是 10,一级栏目ID是 5。<h2>指定三级栏目名称:</h2>
{dede:channel type='son' typeid='5'}
{dede:channel type='son' typeid='10'}
{dede:channel type='son' typeid='25'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
{/dede:channel}
{/dede:channel}
{dede:channel typeid='5'}: 获取ID为 5 的一级栏目下的所有直接子栏目(即二级栏目)。{dede:channel typeid='10'}: 在上面的循环中,获取ID为 10 的二级栏目下的所有直接子栏目(即三级栏目)。{dede:channel typeid='25'}: 在上面的循环中,获取ID为 25 的三级栏目信息,这里我们只取一个,所以它会循环一次。[field:typename/] 就是我们要的三级栏目名。
在首页调用所有三级栏目列表
<h2>所有三级栏目列表:</h2>
<ul>
{dede:channel type='top' typeid='0'}
<!-- 循环一级栏目 -->
<li>
[field:typename/]
<ul>
{dede:channel type='son' typeid='[field:id/]'}
<!-- 循环当前一级栏目下的二级栏目 -->
<li>
[field:typename/]
<ul>
{dede:channel type='son' typeid='[field:id/]'}
<!-- 循环当前二级栏目下的三级栏目 -->
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</li>
{/dede:channel}
</ul>
</li>
{/dede:channel}
</ul>
{dede:channel type='top'}: 获取所有顶级栏目(一级栏目)。{dede:channel type='son' typeid='[field:id/]'} 来获取它的直接子栏目(二级栏目)。{dede:channel type='son' typeid='[field:id/]'} 来获取它的直接子栏目(三级栏目)。
总结与推荐
方法
适用场景
优点
缺点
方法一 (自定义函数)
列表页、内容页调用当前栏目的路径
最灵活、最常用,能动态获取当前栏目的完整路径。
需要修改
extend.func.php 文件。
方法二 (嵌套调用)
首页调用固定的三级栏目名
代码直观,无需自定义函数。
硬编码ID,不灵活,栏目结构变动后需修改模板。
方法三 (嵌套循环)
首页调用所有三级栏目列表
功能强大,可生成完整的栏目树。
代码较复杂,如果栏目层级不确定(比如有四级),会更复杂。
