使用全局变量 $typeid (最常用、最推荐)
DedeCMS 在解析模板时,会自动将当前栏目的 ID 存储在一个全局变量 $typeid 中,这是最直接、最简单的方法。

适用场景
- 在列表页 (
list_article.htm) 和文章页 (article_article.htm) 中,直接获取当前栏目的 ID。 - 在首页 (
index.htm) 或其他页面,通过{dede:field name='typeid' function="getTopID(@me)"/}获取指定栏目的顶级 ID。
代码示例
示例 1:在列表页或文章页中判断
假设你想在 list_article.htm (列表页) 或 article_article.htm (文章页) 中,根据栏目 ID 显示不同的标题。
<h1>
{dede:field.title/}
</h1>
<p class="breadcrumb">
您的位置:{dede:field name='position'/}
</p>
<!-- 在这里开始进行 PHP 判断 -->
<?php
// 获取当前栏目的 ID
$currentTypeId = $typeid;
// 判断栏目 ID 是否为 1
if ($currentTypeId == 1) {
echo '<div class="notice">欢迎来到“公司新闻”栏目!</div>';
}
// 判断栏目 ID 是否为 2
elseif ($currentTypeId == 2) {
echo '<div class="notice">欢迎来到“产品中心”栏目!</div>';
}
// 判断栏目 ID 是否为 3 或 4
elseif ($currentTypeId == 3 || $currentTypeId == 4) {
echo '<div class="notice">欢迎来到“技术文章”或“客户案例”栏目!</div>';
}
// 其他所有栏目
else {
echo '<div class="notice">欢迎来到本站!</div>';
}
?>
示例 2:在首页或自定义页面中判断指定栏目
如果你想在首页调用某个特定栏目(ID 为 5 的栏目)的内容,并对其进行特殊处理,可以使用 {dede:field} 标签结合 function 属性来获取栏目 ID。

<div class="special-column">
<?php
// 假设我们要判断的栏目ID是 5
$targetTypeId = 5;
// 使用 {dede:field} 获取目标栏目的ID,并赋值给 PHP 变量
// 注意:这种方法通常在循环或特定标签内使用,直接获取单个值需要一些技巧。
// 更简单的方式是在需要的地方直接调用。
?>
<!-- 方法 A:直接在模板中判断 (不推荐,可读性差) -->
{dede:field name='typeid' function='if(@me==5) echo "这是栏目5的专属内容!"; else echo "这是其他内容";'/}
<!-- 方法 B:推荐做法,使用一个独立的PHP文件来处理逻辑 -->
<!-- 我们将在下面详细介绍方法三 -->
</div>
使用 {dede:field.typeid/}
这个方法和方法一类似,但它是一个 DedeCMS 的模板标签,而不是直接的 PHP 变量,它可以在任何支持 DedeCMS 模板语法的标签内部使用。
适用场景
- 在
{dede:arclist}、{dede:list} 等循环标签的属性中进行判断。
- 在需要将 ID 值传递给另一个函数或标签时。
代码示例
示例:在 {dede:arclist} 中调用不同栏目下的不同文章数量
假设你希望首页的“公司新闻”(ID=1) 和“产品中心”(ID=2) 显示的文章数量不同。
<!-- 公司新闻栏目,只显示 5 条 -->
{dede:arclist typeid='1' row='5'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
<!-- 产品中心栏目,显示 10 条 -->
{dede:arclist typeid='2' row='10'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
如果你想在 同一个 arclist 里根据当前栏目 ID 动态改变 row 值,可以这样写:
(图片来源网络,侵删)
{dede:arclist typeid='1' row='<?php if($typeid==1) echo 5; else echo 10; ?>'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
注意:虽然这种方法可行,但混合 PHP 和模板标签会降低模板的可读性和可维护性,对于复杂的逻辑,推荐使用方法三。
创建自定义函数 (最灵活、最规范)
当你的判断逻辑非常复杂,或者需要在多个模板中重复使用时,最佳实践是创建一个自定义的 PHP 函数,然后在模板中调用它。
适用场景
- 复杂的判断逻辑。
- 需要在多个模板文件中复用同一段代码。
- 提高模板文件的可读性和整洁度。
操作步骤
第一步:在 /include/common.func.php 文件中添加自定义函数
打开 include/common.func.php 文件,在文件末尾 ?> 之前添加以下 PHP 函数:
/**
* 根据栏目ID获取栏目名称
* @param int $typeid 栏目ID
* @return string 栏目名称
*/
function getChannelName($typeid) {
if (empty($typeid)) {
return '未知栏目';
}
$dsql = new DedeSql(false);
$typename = '';
$query = "SELECT typename FROM `dede_arctype` WHERE id = $typeid";
$dsql->Execute('me', $query);
if ($row = $dsql->GetArray('me')) {
$typename = $row['typename'];
}
$dsql->Close();
return $typename;
}
/**
* 判断当前栏目并返回对应的CSS类名
* @return string CSS类名
*/
function getBodyClassByChannel() {
global $typeid;
if ($typeid == 1) {
return 'channel-news';
} elseif ($typeid == 2) {
return 'channel-product';
} elseif ($typeid == 3 || $typeid == 4) {
return 'channel-tech';
}
return 'channel-default';
}
第二步:在模板文件中调用自定义函数
现在你可以在任何模板文件中调用这些函数了,代码会非常简洁。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">{dede:field.title/} - {dede:global.cfg_webname/}</title>
<style>
.channel-news { background-color: #f0f8ff; }
.channel-product { background-color: #f0fff0; }
.channel-tech { background-color: #fffaf0; }
.channel-default { background-color: #ffffff; }
</style>
</head>
<body class="<?php echo getBodyClassByChannel(); ?>">
<header>
<h1>网站头部</h1>
</header>
<main>
<h2>
<?php
// 调用自定义函数获取栏目名并显示
echo "当前栏目是:" . getChannelName($typeid);
?>
</h2>
<div class="content">
{dede:field.body/}
</div>
</main>
<footer>
<p>网站底部</p>
</footer>
</body>
</html>
这种方法将所有的 PHP 逻辑都集中在了 common.func.php 中,模板文件只负责展示,结构清晰,易于维护。
总结与最佳实践
方法
优点
缺点
推荐场景
$typeid
最简单、最直接、性能最好
仅适用于已加载栏目信息的页面(列表、文章页)
绝大多数情况下的首选,尤其是在列表页和文章页进行简单判断。
{dede:field.typeid/}
纯模板语法,可在标签内部使用
可读性差,复杂逻辑时难以维护
在 DedeCMS 标签的属性中进行简单、动态的赋值。
自定义函数
最灵活、最规范、可复用
需要修改核心文件,对新手有一定门槛
复杂判断逻辑、需要在多处复用代码、追求代码整洁和可维护性的项目。
核心建议:
- 日常开发:优先使用 方法一 (
$typeid),它足够高效且简单。
- 逻辑复杂:当判断逻辑超过 3-4 行,或者需要在多个地方使用时,请采用 方法三(自定义函数),这是专业开发的良好习惯。
- 标签内赋值:当需要在
{dede:arclist} 等标签的 row、titlelen 等属性中动态设置值时,可以考虑使用 方法二。
希望这份详细的指南能帮助你更好地在 DedeCMS 中进行栏目 ID 的判断!
这个方法和方法一类似,但它是一个 DedeCMS 的模板标签,而不是直接的 PHP 变量,它可以在任何支持 DedeCMS 模板语法的标签内部使用。
适用场景
- 在
{dede:arclist}、{dede:list}等循环标签的属性中进行判断。 - 在需要将 ID 值传递给另一个函数或标签时。
代码示例
示例:在 {dede:arclist} 中调用不同栏目下的不同文章数量
假设你希望首页的“公司新闻”(ID=1) 和“产品中心”(ID=2) 显示的文章数量不同。
<!-- 公司新闻栏目,只显示 5 条 -->
{dede:arclist typeid='1' row='5'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
<!-- 产品中心栏目,显示 10 条 -->
{dede:arclist typeid='2' row='10'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
如果你想在 同一个 arclist 里根据当前栏目 ID 动态改变 row 值,可以这样写:

{dede:arclist typeid='1' row='<?php if($typeid==1) echo 5; else echo 10; ?>'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
注意:虽然这种方法可行,但混合 PHP 和模板标签会降低模板的可读性和可维护性,对于复杂的逻辑,推荐使用方法三。
创建自定义函数 (最灵活、最规范)
当你的判断逻辑非常复杂,或者需要在多个模板中重复使用时,最佳实践是创建一个自定义的 PHP 函数,然后在模板中调用它。
适用场景
- 复杂的判断逻辑。
- 需要在多个模板文件中复用同一段代码。
- 提高模板文件的可读性和整洁度。
操作步骤
第一步:在 /include/common.func.php 文件中添加自定义函数
打开 include/common.func.php 文件,在文件末尾 ?> 之前添加以下 PHP 函数:
/**
* 根据栏目ID获取栏目名称
* @param int $typeid 栏目ID
* @return string 栏目名称
*/
function getChannelName($typeid) {
if (empty($typeid)) {
return '未知栏目';
}
$dsql = new DedeSql(false);
$typename = '';
$query = "SELECT typename FROM `dede_arctype` WHERE id = $typeid";
$dsql->Execute('me', $query);
if ($row = $dsql->GetArray('me')) {
$typename = $row['typename'];
}
$dsql->Close();
return $typename;
}
/**
* 判断当前栏目并返回对应的CSS类名
* @return string CSS类名
*/
function getBodyClassByChannel() {
global $typeid;
if ($typeid == 1) {
return 'channel-news';
} elseif ($typeid == 2) {
return 'channel-product';
} elseif ($typeid == 3 || $typeid == 4) {
return 'channel-tech';
}
return 'channel-default';
}
第二步:在模板文件中调用自定义函数
现在你可以在任何模板文件中调用这些函数了,代码会非常简洁。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">{dede:field.title/} - {dede:global.cfg_webname/}</title>
<style>
.channel-news { background-color: #f0f8ff; }
.channel-product { background-color: #f0fff0; }
.channel-tech { background-color: #fffaf0; }
.channel-default { background-color: #ffffff; }
</style>
</head>
<body class="<?php echo getBodyClassByChannel(); ?>">
<header>
<h1>网站头部</h1>
</header>
<main>
<h2>
<?php
// 调用自定义函数获取栏目名并显示
echo "当前栏目是:" . getChannelName($typeid);
?>
</h2>
<div class="content">
{dede:field.body/}
</div>
</main>
<footer>
<p>网站底部</p>
</footer>
</body>
</html>
这种方法将所有的 PHP 逻辑都集中在了 common.func.php 中,模板文件只负责展示,结构清晰,易于维护。
总结与最佳实践
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
$typeid |
最简单、最直接、性能最好 | 仅适用于已加载栏目信息的页面(列表、文章页) | 绝大多数情况下的首选,尤其是在列表页和文章页进行简单判断。 |
{dede:field.typeid/} |
纯模板语法,可在标签内部使用 | 可读性差,复杂逻辑时难以维护 | 在 DedeCMS 标签的属性中进行简单、动态的赋值。 |
| 自定义函数 | 最灵活、最规范、可复用 | 需要修改核心文件,对新手有一定门槛 | 复杂判断逻辑、需要在多处复用代码、追求代码整洁和可维护性的项目。 |
核心建议:
- 日常开发:优先使用 方法一 (
$typeid),它足够高效且简单。 - 逻辑复杂:当判断逻辑超过 3-4 行,或者需要在多个地方使用时,请采用 方法三(自定义函数),这是专业开发的良好习惯。
- 标签内赋值:当需要在
{dede:arclist}等标签的row、titlelen等属性中动态设置值时,可以考虑使用 方法二。
希望这份详细的指南能帮助你更好地在 DedeCMS 中进行栏目 ID 的判断!
