使用 {dede:field name='typeid'} 获取ID,再通过SQL查询(最通用)
这种方法的核心思路是:

(图片来源网络,侵删)
- 先获取当前栏目的ID (
typeid)。 - 再通过一个SQL查询语句,根据当前栏目的ID找到它的上一级栏目ID (
topid或reid)。 - 最后根据上一级栏目ID调用出上一级栏目的信息。
这种方法适用于任何模板文件,包括列表页 (list_*.htm页 (article_*.htm) 和自定义模板。
代码示例
假设你想在当前页面的某个位置显示上一级栏目的名称和链接。
{dede:sql sql="SELECT * FROM `dede_arctype` WHERE id = (SELECT reid FROM `dede_arctype` WHERE id = ~typeid~)"}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:sql}
代码解析:
{dede:sql ...}: 这是 DedeCMS 的自定义SQL标签,用于执行数据库查询。sql="...": 里面是我们要执行的SQL语句。~typeid~: 这是 DedeCMS 的一个特殊变量,会自动被替换为当前栏目的ID,如果当前栏目ID是 5,那么这里就变成了WHERE id = (SELECT reid FROM ... WHERE id = 5)。SELECT reid FROM dede_arctype WHERE id = 5: 这个子查询的作用是,在dede_arctype(栏目表) 中找到ID为5的记录,并返回它的reid字段值。reid父栏目ID”。SELECT * FROM dede_arctype WHERE id = (子查询结果): 外层查询则根据上一步得到的父栏目ID,查询出上一级栏目的所有信息。[field:typelink/]: 调用上一级栏目的链接地址。[field:typename/]: 调用上一级栏目的名称。
在列表页 (list_*.htm) 中直接调用
如果你只需要在列表页调用上一级栏目,可以利用 DedeCMS 内置的变量,方法更简单。

(图片来源网络,侵删)
代码示例
<a href="{dede:type}[field:typelink/]{/dede:type}">{dede:type}[field:typename/]{/dede:type}</a>
代码解析:
{dede:type}...{/dede:type}: 这个标签在列表页中默认就是指当前栏目。- 在列表页中,还有一个非常重要的内置变量:
$typeinfos,它包含了当前栏目的所有信息,也包括了它的父级信息。 - 我们可以直接使用
$typeinfos的子项来调用上一级栏目。$typeinfos['reid']就是父级ID,$typeinfos['topid']是顶级ID,我们可以通过这个ID去获取父级栏目的完整信息。
更推荐写法:
{dede:geturl typeid='[field:reid/]' runphp='yes'}
$typeid = @me;
$row = $GLOBALS['dsql']->GetOne("SELECT * FROM `dede_arctype` WHERE id = $typeid");
@me = "<a href='{$row['typedir']}'>{$row['typename']}</a>";
{/dede:geturl}
最简单直接的方式是结合 {dede:sql} 标签,与方法一类似,但在列表页中可以直接使用 [field:reid/] 来获取父级ID,代码更清晰。
{dede:sql sql="SELECT * FROM `dede_arctype` WHERE id = [field:reid/]"}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:sql}
页 (article_*.htm) 中调用
页,调用上一级栏目也非常方便,因为内容页也包含了当前文章所属栏目的所有信息。

(图片来源网络,侵删)
代码示例
{dede:sql sql="SELECT * FROM `dede_arctype` WHERE id = [field:typeid function='GetTopid(@me)'/]"}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:sql}
代码解析:
[field:typeid function='GetTopid(@me)'/]: 这是一个非常实用的函数。[field:typeid]获取的是当前文章所属栏目的ID。function='GetTopid(@me)'会调用 DedeCMS 的GetTopid()函数,这个函数会根据传入的栏目ID,返回其顶级栏目的ID。- 这段代码调用的是顶级栏目,而不是直接的上一级栏目。
如果你想调用直接的上一级栏目,应该使用:
{dede:sql sql="SELECT * FROM `dede_arctype` WHERE id = [field:reid/]"}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:sql}
或者,直接使用内容页内置的 $typename 变量(它代表当前栏目名称)和 $typelink(代表当前栏目链接),但这只能获取到当前栏目,要获取上一级,还是需要SQL查询。
使用 channel 标签(适用于导航栏等)
如果你想在页面的某个位置(比如面包屑导航上方)显示一个固定的“返回上级栏目”的链接,并且这个上级栏目是动态的,你也可以使用 channel 标签结合PHP。
这种方法稍微复杂一点,但功能强大。
代码示例
{dede:php}
$typeid = $GLOBALS['typeid'];
$dsql = new DedeSql(false);
$row = $dsql->GetOne("SELECT reid,topid FROM `dede_arctype` WHERE id = $typeid");
$parent_id = $row['reid'];
$top_id = $row['topid'];
// 如果存在上级栏目
if($parent_id > 0){
$parent_row = $dsql->GetOne("SELECT id,typename,typedir FROM `dede_arctype` WHERE id = $parent_id");
echo "<a href='".$parent_row['typedir']."'>".$parent_row['typename']."</a>";
}
// 如果没有上级栏目(即顶级栏目),则可以调用顶级栏目本身或做其他处理
else{
// echo "这是顶级栏目";
}
$dsql->Close();
{/dede:php}
代码解析:
{dede:php}...{/dede:php}: 允许在模板中直接执行PHP代码。- 我们首先获取当前栏目的ID (
$GLOBALS['typeid'])。 - 然后执行一次查询,获取这个栏目的
reid(父级ID) 和topid(顶级ID)。 - 判断
reid是否大于0,如果是,说明它不是顶级栏目。 - 再次执行查询,根据
reid获取上一级栏目的完整信息(名称、链接等)。 - 最后用
echo输出HTML代码。
总结与推荐
| 场景 | 推荐方法 | 优点 | 缺点 |
|---|---|---|---|
| 通用模板 (列表/内容/自定义) | 方法一 ({dede:sql}) |
逻辑清晰,最通用,不依赖特定页面变量 | SQL语句稍复杂 |
| *仅列表页 (`list_.htm`)** | 方法二 ({dede:sql} + [field:reid/]) |
代码简洁,直接利用列表页变量 | 仅限列表页使用 |
| 复杂逻辑/需要PHP处理 | 方法四 ({dede:php}) |
灵活性最高,可以做任何判断和处理 | 代码量大,需要PHP基础 |
对于绝大多数情况,方法一 ({dede:sql}) 是最推荐、最稳定、最容易理解的方案,你可以把它复制到任何需要的地方,稍作修改即可使用。
