在DedeCMS(织梦CMS)中,判断当前栏目ID(typeid)是一个非常常见的需求,尤其是在制作自定义模板时,下面我将为你详细介绍几种最常用和最可靠的方法,并附上代码示例。

(图片来源网络,侵删)
使用全局变量 $typeid(最常用、最直接)
这是最简单、最直接的方法,DedeCMS在解析页面时,会根据当前所在的栏目或文章,自动将栏目ID赋值给全局变量 $typeid。
适用场景:
- 在当前栏目列表页、文章内容页、栏目封面页等所有与特定栏目相关的页面。
代码示例:
你可以直接在模板文件(如 list_article.htm, article_article.htm, index.htm 等)的PHP代码部分或需要判断的位置使用。

(图片来源网络,侵删)
{dede:php}
// 获取当前栏目ID
$currentTypeId = $typeid;
if ($currentTypeId > 0) {
echo "当前栏目ID是: " . $currentTypeId;
// 根据不同栏目ID显示不同的内容
if ($currentTypeId == 5) {
echo " - 这是ID为5的栏目";
} else if ($currentTypeId == 10) {
echo " - 这是ID为10的栏目";
}
} else {
echo "当前页面没有栏目ID(首页或自定义页面)。";
}
{/dede:php}
优点:
- 简单快捷,无需额外查询数据库。
- 在绝大多数情况下都能正常工作。
使用 GetTopid() 获取顶级栏目ID
你可能需要获取当前栏目所属的顶级栏目ID,一个栏目“新闻”下有“国内新闻”和“国际新闻”,你在“国内新闻”页面,不仅需要当前栏目ID,还需要顶级栏目“新闻”的ID。
GetTopid() 函数就是用来实现这个功能的。
适用场景:
- 在多级栏目结构中,需要获取顶级栏目ID来做判断或调用数据。
代码示例:
{dede:php}
// 获取当前顶级栏目ID
$topTypeId = GetTopid();
if ($topTypeId > 0) {
echo "当前顶级栏目ID是: " . $topTypeId;
// 只在顶级栏目“新闻”(假设ID为2)的子栏目中显示特定内容
if ($topTypeId == 2) {
echo " - 你正在浏览新闻频道的子栏目。";
}
} else {
echo "当前页面没有顶级栏目ID。";
}
{/dede:php}
通过SQL查询获取栏目信息(最灵活)
如果你需要获取当前栏目的更多信息,而不仅仅是ID(如栏目名称、类型、SEO标题等),或者你需要进行更复杂的逻辑判断,那么通过SQL查询 dede_arctype 表是最佳选择。
适用场景:
- 需要获取当前栏目的名称、描述、SEO关键词等详细信息。
- 需要根据栏目的某个字段(如
typedir、isdefault等)进行判断。 - 在首页等没有
$typeid的地方,想通过其他方式获取栏目信息。
代码示例:
{dede:php}
// 确保当前有栏目ID
if ($typeid > 0) {
// 查询当前栏目信息
$query = "SELECT id, typename, typedir, isdefault FROM `dede_arctype` WHERE id = $typeid";
$row = $dsql->GetOne($query);
if (is_array($row)) {
echo "栏目ID: " . $row['id'] . "<br>";
echo "栏目名称: " . $row['typename'] . "<br>";
echo "栏目目录: " . $row['typedir'] . "<br>";
// 根据栏目类型进行判断
if ($row['isdefault'] == '1') {
echo "这是一个默认封面栏目。";
}
} else {
echo "未找到ID为 " . $typeid . " 的栏目。";
}
} else {
echo "当前页面没有栏目ID。";
}
{/dede:php}
在首页或其他无ID页面判断特定栏目
你可能想在首页上显示某个特定栏目的内容,这时首页的 $typeid 是0,你可以通过直接指定栏目ID来实现。
适用场景:
- 在首页调用指定ID的栏目内容。
- 在自定义页面中判断并显示某个栏目的信息。
代码示例:
假设你想在首页判断并显示ID为5的栏目的名称。
{dede:php}
// 指定一个你想要判断的栏目ID
$targetTypeId = 5;
// 查询该栏目的信息
$query = "SELECT typename FROM `dede_arctype` WHERE id = $targetTypeId";
$row = $dsql->GetOne($query);
if (is_array($row)) {
// 如果栏目存在,则显示其名称
echo "首页正在展示的栏目是: " . $row['typename'];
} else {
echo "ID为 " . $targetTypeId . " 的栏目不存在。";
}
{/dede:php}
总结与推荐
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
$typeid |
绝大多数页面(列表、内容、封面页) | 最简单、最直接、性能最好 | 无法获取顶级ID或其他字段信息 |
GetTopid() |
多级栏目结构中,需要顶级ID | 便捷地获取顶级栏目ID | 功能相对单一,仅限于顶级ID |
| SQL查询 | 需要栏目详细信息或复杂逻辑判断 | 最灵活、功能最强大 | 需要写SQL代码,相对复杂一点 |
| 指定ID判断 | 首页、自定义页面等 | 可以在无$typeid的页面操作 |
需要手动指定ID,不够动态 |
最佳实践建议:
- 常规需求:如果你只需要在当前栏目页面做一些判断或显示,直接使用
$typeid是最完美的选择。 - 多级栏目:如果你的网站栏目层级很深,并且需要用到顶级栏目的ID,请使用
GetTopid()。 - 复杂逻辑:如果你需要根据栏目的名称、SEO设置等来决定模板的显示方式,请使用 SQL查询 的方法。
- 首页调用:在首页等特殊页面,直接通过 SQL查询指定ID 的栏目信息。
希望这些方法能帮助你解决在DedeCMS开发中遇到的问题!
