在 DedeCMS (织梦CMS) 中,获取当前栏目的 ID 是一个非常常见的需求,主要有两种场景:在列表页/内容页获取当前栏目ID 和 在PHP代码中获取栏目ID。

下面我将为你详细介绍这两种情况下的方法。
在模板文件中使用 (列表页、内容页、封面页)
这是最常见的情况,你需要在 article_list.htm (列表页), article_article.htm (内容页), 或 index.htm (封面页) 等模板文件中获取当前栏目的ID。
DedeCMS 提供了非常方便的全局变量 {dede:fieldtypeid/} 来实现这一点。
在列表页 (article_list.htm) 获取
在列表页模板中,直接使用 {dede:fieldtypeid/} 即可获取当前列表页所对应的栏目ID。

示例: 在列表页的某个位置显示当前栏目ID,通常用于JS交互或判断。
<p>当前栏目ID是: {dede:fieldtypeid/}</p>
<!-- 常见应用:根据栏目ID调用不同的样式或JS -->
{dede:fieldtypeid runphp='yes'}
$typeid = @me;
if($typeid == 5) {
@me = "<script>alert('这是产品栏目!');</script>";
} else {
@me = "";
}
{/dede:fieldtypeid}
页 (article_article.htm) 获取
页,使用 {dede:fieldtypeid/} 可以获取这篇文章所属的栏目ID。
示例: 在文章页获取当前栏目ID,并用于调用相关文章或其他逻辑。
<p>这篇文章所在的栏目ID是: {dede:fieldtypeid/}</p>
<!-- 常见应用:调用同栏目的热门文章 -->
{dede:arclist typeid='{dede:fieldtypeid/}' titlelen='40' row='5'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
在封面页 (index.htm) 获取
在栏目封面页(首页是特殊的封面页),使用 {dede:fieldtypeid/} 同样可以获取当前封面页对应的栏目ID。
示例: 在栏目封面页获取ID,用于调用该栏目的子栏目或文章列表。
<p>当前封面页的栏目ID是: {dede:fieldtypeid/}</p>
在PHP文件/函数中获取
如果你在自定义的PHP函数、文件或插件中需要获取当前栏目ID,你不能直接使用模板标签,你需要通过DedeCMS的全局对象 $GLOBALS 或 global 关键字来获取。
核心变量是 $GLOBALS['typeid']。
在PHP函数中获取
如果你在自定义的函数里需要用到当前栏目ID,你需要先声明 global $typeid;。
示例: 创建一个自定义函数,并获取当前栏目ID。
function get_current_typeid() {
// 声明全局变量,这是关键!
global $typeid;
// 现在你可以使用 $typeid 这个变量了
if ($typeid) {
echo "在PHP函数中获取到的当前栏目ID是: " . $typeid;
} else {
echo "当前页面没有栏目ID。";
}
}
// 调用这个函数
get_current_typeid();
在PHP文件中获取
如果你在一个PHP文件(plus/myphp.php)中,并且这个文件是在某个栏目下执行的,同样可以使用 $GLOBALS['typeid']。
示例:
在 myphp.php 文件中输出当前栏目ID。
<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");
// 通过$GLOBALS数组获取
$current_typeid = $GLOBALS['typeid'];
if ($current_typeid) {
echo "在PHP文件中获取到的当前栏目ID是: " . $current_typeid;
} else {
echo "当前页面没有栏目ID。";
}
?>
重要注意事项和常见问题
-
作用域:
{dede:fieldtypeid/}只在模板文件(.htm)中有效。$GLOBALS['typeid']只在由DedeCMS引擎解析的页面中有效(即通过index.php或dede/目录下的文件访问的页面),如果你直接访问一个PHP文件,$GLOBALS['typeid]通常是空的。
-
首页的特殊性:
- 在网站首页 (
index.php),{dede:fieldtypeid/}和$GLOBALS['typeid']的值是 0,这是DedeCMS的设计,首页不属于任何具体栏目,如果你的逻辑需要判断是否为首页,可以检查ID是否为0。
- 在网站首页 (
-
动态页面与静态页面:
无论是生成静态HTML文件还是动态浏览PHP文件,上述方法都同样有效,因为栏目ID信息在页面解析时就已经被DedeCMS的核心程序加载到全局变量中了。
-
嵌套循环:
- 在模板中使用
{dede:arclist}或{dede:channel}等循环标签时,循环体内的{dede:fieldtypeid/}或$GLOBALS['typeid']指的是 循环体本身 的栏目ID,而不是外层页面的栏目ID。 - 示例:在列表页调用另一个栏目的文章,此时循环体内的
typeid是被调用栏目的ID,而不是列表页本身的ID。
- 在模板中使用
| 场景 | 方法 | 示例 |
|---|---|---|
| 在模板文件中 (列表、内容、封面页) | 使用 {dede:fieldtypeid/} |
<p>ID: {dede:fieldtypeid/}</p> |
| 在PHP代码/函数中 | 使用 global $typeid; 或 $GLOBALS['typeid'] |
echo $GLOBALS['typeid']; |
根据你的具体使用场景,选择最适合的方法即可,对于绝大多数前端模板的开发,使用 {dede:fieldtypeid/} 就足够了。
