使用 {dede:field name='position'} 标签(最推荐,用于面包屑)
这是最简单、最标准的方法,专门用于生成面包屑导航(也叫“当前位置”),它会自动获取从顶级栏目到当前栏目的完整路径,并用 >> 分隔。

(图片来源网络,侵删)
标签代码:
{dede:field name='position'/}
示例效果:
如果你的文章位于 首页 >> 新闻中心 >> 国内新闻 这个路径下,{dede:field name='position'} 输出的HTML就是:
<a href='http://你的域名/'>首页</a> >> <a href='http://你的域名/news/'>新闻中心</a> >> <a href='http://你的域名/news/gn/'>国内新闻</a>
如何只获取上级栏目的链接?
{dede:field name='position'} 会输出整个路径,如果你只想获取直接上级栏目的链接,需要一些技巧,可以通过获取完整的 position 字符串,然后用PHP代码进行截取和解析。

(图片来源网络,侵删)
示例:只获取上级栏目链接
在文章页或列表页模板中,可以这样写:
{dede:field name='position' runphp='yes'}
// 获取完整的position字符串,"首页 >> 新闻中心 >> 国内新闻"
$position = @me;
// 按 ">> " 分割成数组
$arr = explode('>> ', $position);
// 去掉数组的第一个元素(首页)和最后一个元素(当前栏目)
// array_pop() 去掉最后一个,array_shift() 去掉第一个
array_pop($arr);
array_shift($arr);
// 如果上级栏目不止一层(比如新闻中心),我们需要重新拼接
// 如果上级栏目只有一层(比如直接在首页下的栏目),这个逻辑会出问题,所以更健壮的方法是获取上一级ID
// 更好的方法:直接获取上一级栏目ID
$upid = $GLOBALS['envs']['arcid'] ? GetTopid($GLOBALS['envs']['arcid']) : 0; // 获取当前栏目的顶级ID,这个不适用
// 修正:直接获取当前栏目的父级ID
$arc = GetOneArchive($GLOBALS['envs']['arcid']); // 获取当前文档的信息
$upid = $arc['typeid'] ? $arc['topid'] : 0; // 获取当前栏目的顶级ID,还是不对
// 正确获取父级ID的方法:
$sql = "SELECT reid FROM `dede_arctype` WHERE id = '{$GLOBALS['envs']['arcid']}'";
$row = $GLOBALS['dsql']->GetOne($sql);
$upid = $row['reid'];
if($upid > 0){
$typeinfo = GetOneType($upid);
@me = "<a href='".$typeinfo['typedir']."'>".$typeinfo['typename']."</a>";
}else{
@me = "";
}
// 下面是一个更简单但可能不够严谨的字符串处理方法,适用于结构简单的网站
/*
$count = count($arr);
if($count > 0){
// 去掉最后一个元素(当前栏目)
array_pop($arr);
// 重新拼接
$parent_str = implode(' >> ', $arr);
@me = $parent_str;
}else{
@me = '首页';
}
*/
{/dede:field}
对于“只获取上级链接”这个需求,直接用SQL查询数据库获取父级ID是最准确的方法,但99%的情况下,你需要的其实是面包屑,所以方法一才是最推荐的。
使用 {dede:type} 标签(用于已知上级栏目ID)
如果你在模板中已经知道上级栏目的ID(比如在列表页或内容页通过其他方式获取到了),{dede:type} 是最直接的选择。
标签代码:
{dede:type typeid='上级栏目的ID'}
<a href='[field:typedir/]'>[field:typename/]</a>
{/dede:type}
如何获取上级栏目ID?
你可以在模板中先通过PHP获取到上级ID,然后再交给 {dede:type} 使用,这通常用在文章页或列表页。
示例(在文章页调用上级栏目链接):
假设你在文章详情页 article_article.htm,想获取当前文章所在栏目的直接上级栏目链接。
{dede:php}
// 获取当前文章的栏目ID
$arcid = $GLOBALS['envs']['arcid'];
// 查询当前栏目的信息,以获取其父级ID (reid)
$sql = "SELECT reid FROM `dede_arctype` WHERE id = '{$arcid}'";
$row = $GLOBALS['dsql']->GetOne($sql);
// 父级ID
$parent_id = $row['reid'];
// 如果存在父级栏目
if ($parent_id > 0) {
// 查询父级栏目的详细信息
$parent_type = $GLOBALS['dsql']->GetOne("SELECT id, typename, typedir FROM `dede_arctype` WHERE id = '{$parent_id}'");
// 将信息输出到模板
echo "<a href='".$parent_type['typedir']."'>".$parent_type['typename']."</a>";
}
{/dede:php}
通过自定义函数(最灵活、可复用)
如果你在多个模板中都需要这个功能,或者想让调用更简洁,最好的方式是创建一个自定义函数。
步骤 1:创建函数文件
在 include/extend.func.php 文件中(如果这个文件不存在,就新建一个)添加以下PHP函数:
/**
* 获取指定栏目的直接上级栏目链接
* @param int $typeid 当前栏目ID
* @return string 返回上级栏目的HTML链接,如果没有则返回空字符串
*/
function GetParentTypeLink($typeid = 0) {
if (empty($typeid)) {
global $typeid; // 如果没有传入ID,尝试从全局变量获取
}
$dsql = new DedeSql(false);
$row = $dsql->GetOne("SELECT reid FROM `dede_arctype` WHERE id = '{$typeid}'");
if (empty($row['reid'])) {
return '';
}
$parent_row = $dsql->GetOne("SELECT id, typename, typedir FROM `dede_arctype` WHERE id = '{$row['reid']}'");
if (empty($parent_row)) {
return '';
}
return "<a href='{$parent_row['typedir']}'>{$parent_row['typename']}</a>";
}
步骤 2:在模板中调用
你可以在任何需要的地方,像调用普通标签一样使用这个函数了。
示例:
在文章页调用上级栏目链接:
{dede:php}
echo GetParentTypeLink($GLOBALS['envs']['arcid']);
{/dede:php}
在列表页调用上级栏目链接:
{dede:php}
echo GetParentTypeLink($GLOBALS['typeid']);
{/dede:php}
或者直接传入ID:
{dede:php}
echo GetParentTypeLink(5); // 假设上级栏目ID是5
{/dede:php}
总结与推荐
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
{dede:field name='position'} |
最简单、最标准,专门用于面包屑 | 无法直接获取单个上级链接 | 面包屑导航({dede:field name='position'/}) |
{dede:type} |
语法清晰,直接明了 | 需要预先知道上级栏目ID | 当你通过其他方式(如PHP)获取到上级ID后,快速生成链接 |
| 自定义函数 | 最灵活、最可复用,代码整洁 | 需要修改PHP文件,对新手稍复杂 | 在网站中多处需要调用上级链接,追求代码复用和维护性的项目 |
给你的最终建议:
- 如果你要做面包屑导航,直接使用 方法一
{dede:field name='position'/},这是它的本职工作。 - 如果你只需要在某个特定位置显示上级链接,并且能通过PHP获取到ID,使用 方法二 的
{dede:type}标签即可。 - 如果你的网站结构复杂,或者这个需求会在很多地方出现,强烈推荐你花几分钟时间配置 方法三,创建自定义函数,这会让你的模板文件非常干净,也更容易后期维护。
