使用顶级栏目ID标签 {dede:field.typeid/} (最推荐)
这是最简单、最直接,也是官方推荐的方法,DedeCMS 的一个巧妙设计是,顶级栏目和其所有子栏目都共享同一个顶级栏目ID,直接调用当前栏目的 typeid 标签,获取的就是顶级栏目的ID。

适用场景:在任何需要获取顶级栏目ID的地方,尤其是在列表页和内容页。
示例代码:
假设你想在列表页 (list_article.htm) 的某个位置显示顶级栏目的ID,可以这样写:
<p>当前顶级栏目的ID是:{dede:field.typeid/}</p>
如果你想获取顶级栏目的名称,可以这样写:

<p>当前顶级栏目的名称是:{dede:typename function='GetTopTypename(@me)'/}</p>
说明:这里用到了一个自定义函数
GetTopTypename,你需要确保你的系统支持这个函数,这个函数的作用是传入一个ID,返回该ID对应的顶级栏目名称,大部分模板都内置了这个函数。
使用SQL查询获取顶级栏目信息 (最灵活)
如果你需要获取顶级栏目的更多信息,比如栏目名称、栏目链接、栏目描述等,使用SQL查询是最灵活的方法。
适用场景:当你不仅需要ID,还需要其他栏目属性时。
示例代码:
在列表页 (list_article.htm) 或内容页 (article_article.htm) 中,你可以通过SQL标签来查询。
在列表页 (list_article.htm) 中:
当前栏目的ID可以通过 {dede:fieldtypeid/} 获取。
{dede:sql sql="SELECT * FROM `dede_arctype` WHERE id = ~typeid~"}
<h2>顶级栏目名称:[typename]</h2>
<p>顶级栏目链接:[field:typelink function='str_replace("~aid~", "", "@me")'/]</p>
<p>顶级栏目描述:[description]</p>
{/dede:sql}
注意:在列表页的SQL中,
typeid需要加上 符号,如~typeid~,DedeCMS会自动将其替换为当前栏目的ID。
页 (article_article.htm) 中:
页没有直接的 typeid 变量,需要先获取当前文章的栏目ID,再通过这个ID查询顶级栏目。
{dede:sql sql="SELECT
t1.id AS top_id,
t1.typename AS top_name,
t1.typelink AS top_link
FROM
`dede_arctype` t1
JOIN
`dede_arctype` t2 ON t1.id = t2.topid
WHERE
t2.id = ~typename~"}
<h2>顶级栏目ID:[field:top_id/]</h2>
<h2>顶级栏目名称:[field:top_name/]</h2>
<p>顶级栏目链接:[field:top_link/]</p>
{/dede:sql}
说明:这个SQL查询的逻辑是:
- 从
dede_arctype表中自连接查询 (t1 JOIN t2)。- 连接条件是
t1.id = t2.topid,即找到t2的父栏目t1。WHERE t2.id = ~typename~筛选出当前文章所在栏目 (t2) 的记录。- 这样查询出来的
t1就是顶级栏目。~typename~在内容页中代表当前文章的栏目ID。
使用PHP代码获取 (适用于PHP文件)
如果你在PHP文件(如 index.php 或自定义的PHP页面)中操作,可以直接使用PHP代码来获取。
适用场景:在PHP程序逻辑中获取顶级栏目信息。
示例代码:
假设你已经获取了当前栏目的ID $currentTypeID。
<?php
// 假设这是当前栏目的ID,可能是从URL参数或其他地方获取的
$currentTypeID = 15; // 示例ID
// 引入数据库配置文件
require_once (dirname(__FILE__) . "/include/common.inc.php");
// 方法1:循环向上查找顶级栏目
function getTopChannel($typeid, $dsql) {
$query = "SELECT topid FROM `dede_arctype` WHERE id = '$typeid'";
$row = $dsql->GetOne($query);
// 如果topid为0,说明它本身就是顶级栏目
if ($row['topid'] == 0) {
return $typeid;
} else {
// 否则,递归调用自身,继续查找其父级
return getTopChannel($row['topid'], $dsql);
}
}
$topTypeID = getTopChannel($currentTypeID, $dsql);
// 现在你可以用 $topTypeID 去查询顶级栏目的完整信息
$topChannelQuery = "SELECT * FROM `dede_arctype` WHERE id = '$topTypeID'";
$topChannel = $dsql->GetOne($topChannelQuery);
if (is_array($topChannel)) {
echo "顶级栏目ID: " . $topChannel['id'] . "<br>";
echo "顶级栏目名称: " . $topChannel['typename'] . "<br>";
echo "顶级栏目链接: " . GetOneTypeUrlA($topChannel) . "<br>";
}
?>
说明:
topid字段在dede_arctype表中记录了栏目的直接父级ID,顶级栏目的topid为 0。GetOneTypeUrlA()是DedeCMS内置的函数,用于根据栏目信息生成完整的栏目链接。
总结与推荐
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
{dede:field.typeid/} |
最简单、最直接、性能最好 | 只能获取ID,需要结合函数获取名称 | 绝大多数情况,尤其是只需要ID时 |
| SQL查询 | 非常灵活,可获取任意栏目属性 | 代码稍复杂,需要了解SQL和表结构 | 需要获取栏目名称、链接、描述等多信息时 |
| PHP代码 | 功能最强大,可集成复杂逻辑 | 需要PHP编程能力,不适合在模板中直接使用 | 在PHP程序文件中进行后台逻辑处理时 |
对于日常的模板修改工作,强烈推荐使用方法一,因为它最简单且足够稳定,只有在需要获取栏目ID以外的其他信息时,才考虑使用方法二。
