在 DedeCMS 中,栏目 ID(通常用 id 或 typeid 表示)是整个系统的核心标识符,用于唯一确定一个栏目,无论是前端模板调用、后台开发还是二次开发,都离不开它。

栏目 ID 是什么?
栏目 ID 是数据库中 dede_arctype 表里 id 字段的值,每个栏目都有一个唯一的数字 ID。
查看方法:
- 登录 DedeCMS 后台。
- 进入【核心】 -> 【栏目管理】。
- 将鼠标悬停在任何栏目名称上,浏览器左下角状态栏会显示该栏目的编辑链接,如
javascript:EditArc(1,0),其中的1通常就是该栏目的 ID,或者直接点击栏目进入编辑页面,URL 中也会有id=1这样的参数。
如何获取栏目 ID?
根据不同的使用场景,获取栏目 ID 的方法也不同。
在模板文件中获取(最常用)
这是最常见的情况,尤其是在制作首页、列表页、内容页等模板时。

a. 当前栏目 ID (用于列表页、内容页等)
在栏目列表页或文章内容页,你通常需要获取当前正在浏览的栏目的 ID。
- 获取方式: 使用全局变量
typeid。 - 适用场景: 列表页
list_article.htm、文章页article_article.htm等。 - 示例代码:
{dede:field name='typeid' function="GetTopid(@me)" /}- 这段代码会获取当前栏目的 ID,并通过
GetTopid函数获取其顶级栏目的 ID,如果只需要当前栏目 ID,直接使用{dede:field.name='typeid'/}即可。
- 这段代码会获取当前栏目的 ID,并通过
b. 指定栏目 ID (用于首页或其他页面调用特定栏目)
在首页模板或其他模板中,你可能需要调用一个已知 ID 的栏目的内容。

-
获取方式: 直接在标签中使用
typeid='数字'属性。 -
适用场景: 首页调用某个指定栏目的文章、栏目链接等。
-
示例代码:
<!-- 调用栏目ID为 5 的栏目下的文章 --> {dede:arclist typeid='5' titlelen='30' row='8'} <li> <a href="[field:arcurl/]">[field:title/]</a> </li> {/dede:arclist} <!-- 获取栏目ID为 3 的栏目名称和链接 --> {dede:type typeid='3'} <a href="[field:typelink/]">[field:typename/]</a> {/dede:type}
c. 通过栏目名称获取栏目 ID (不推荐,但偶尔需要)
在极少数情况下,你可能只有栏目名称,需要先找到它的 ID 再进行调用,这通常需要自定义函数。
-
获取方式: 编写一个自定义函数,在
include/common.func.php中添加。 -
示例函数 (添加到
include/common.func.php):/** * 根据栏目名称获取栏目ID * @param string $typename 栏目名称 * @return int 栏目ID,如果找不到则返回0 */ function GetTypeIdByTypename($typename) { global $dsql; $query = "SELECT id FROM `dede_arctype` WHERE typename = '" . $dsql->EscapeString($typename) . "'"; $row = $dsql->GetOne($query); return $row['id'] ? $row['id'] : 0; } -
在模板中调用:
{dede:php} $typeidByName = GetTypeIdByTypename('公司新闻'); // 现在你可以使用 $typeidByName 变量了 {/dede:php} {dede:arclist typeid='[field:php]echo $typeidByName;[/field:php]' row='5'} [field:title/] {/dede:arclist}注意:这种方法效率较低,且当栏目名称有重复时会出错,最佳实践是直接使用 ID。
在 PHP 代码中获取(用于二次开发)
如果你在开发一个自定义的 PHP 文件或模块,需要通过 PHP 代码来获取栏目 ID。
a. 获取当前栏目 ID
如果你在一个栏目页面或文章页面,并且这个页面是由 DedeCMS 驱动的,可以直接使用全局变量。
global $typeid;
$currentTypeId = $typeid;
// 或者,如果你在文章页,并想获取文章所属的栏目ID
global $arcID;
if($arcID){
$query = "SELECT typeid FROM `dede_archives` WHERE id = $arcID";
$row = $dsql->GetOne($query);
$currentTypeId = $row['typeid'];
}
b. 通过 SQL 查询获取栏目 ID
这是最灵活的方式,你可以根据任何条件来获取。
require_once(dirname(__FILE__)."/include/common.inc.php"); // 引入核心文件
// 1. 通过栏目名称获取ID
$typename = "产品中心";
$row = $dsql->GetOne("SELECT id FROM `#@__arctype` WHERE typename = '$typename'");
if($row){
$idByName = $row['id'];
echo "栏目 '$typename' 的ID是: " . $idByName;
}
// 2. 获取顶级栏目ID
$parentId = 10; // 假设一个栏目ID
$topId = GetTopid($parentId); // 调用DedeCMS内置函数
echo "栏目ID为 $parentId 的顶级栏目ID是: " . $topId;
// 3. 通过路径获取ID
// 栏目别名/路径是 'products'
$typedir = 'products';
$row = $dsql->GetOne("SELECT id FROM `#@__arctype` WHERE typedir = '$typedir'");
if($row){
$idByDir = $row['id'];
echo "路径为 '$typedir' 的栏目ID是: " . $idByDir;
}
常用内置函数与栏目 ID 相关
DedeCMS 提供了一些非常实用的函数来处理栏目 ID:
GetTopid($typeid): 获取指定栏目 ID 的顶级栏目的 ID,这在面包屑导航中非常常用。GetSonIds($typeid): 获取指定栏目 ID 的所有子栏目的 ID,以逗号分隔的字符串形式返回,常用于调用子栏目的内容。- 示例:调用栏目ID为 2 的所有子栏目下的文章。
{dede:arclist typeid='2' row='10'} {dede:php} $sonIds = GetSonIds(@me); // 将typeid替换为子栏目ID列表 @me = str_replace("typeid='2'", "typeid='$sonIds'", @me); {/dede:php} [field:title/] {/dede:arclist}注意:这个用法比较复杂,更简单的方式是使用
{dede:channelartlist}
- 示例:调用栏目ID为 2 的所有子栏目下的文章。
总结与最佳实践
| 场景 | 推荐方法 | 示例 |
|---|---|---|
| 模板中调用当前栏目内容 | 使用全局变量 {dede:field.name='typeid'/} |
{dede:arclist typeid='{dede:field.name='typeid'/}'} |
| 模板中调用指定栏目内容 | 在标签中直接写死 typeid='数字' |
{dede:arclist typeid='5'} |
| 二次开发中获取当前ID | 使用全局变量 global $typeid; |
$id = $typeid; |
| 二次开发中根据条件查询ID | 执行 SQL 查询 | $dsql->GetOne("SELECT id FROM ..."); |
| 获取顶级栏目ID | 使用函数 GetTopid($id) |
$topId = GetTopid($typeid); |
核心要点:
typeid是关键:无论是模板标签还是 PHP 函数,typeid参数都是指定栏目的核心。- 直接使用 ID 效率最高:尽量避免通过名称等字段去反查 ID,尤其是在高频调用的地方。
- 熟悉内置函数:
GetTopid等函数能大大简化你的开发工作。 - 后台管理:记住你可以在后台的【栏目管理】中轻松找到任何一个栏目的 ID。
希望这份详细的解释能帮助你完全理解 DedeCMS 中的栏目 ID!
