使用全局变量 $typeid (最常用、最推荐)
这是获取当前栏目 ID 最直接、最简单的方法,DedeCMS 在处理页面时,会自动将当前栏目的 ID 存储在全局变量 $typeid 中。
适用场景:
- 在列表页 (
list.php)页 (article_article.php或自定义的文章模板) - 在自定义的栏目页面模板中
示例代码:
<?php
// 获取当前栏目ID
$currentTypeId = $typeid;
// 使用 echo 输出
echo "当前栏目ID是:" . $currentTypeId;
// 或者直接使用,例如查询当前栏目下的文章
$dsql = new DedeSql(false);
$sql = "SELECT * FROM `dede_archives` WHERE typeid = '$currentTypeId' ORDER BY id DESC LIMIT 10";
$dsql->SetQuery($sql);
$dsql->Execute();
while ($row = $dsql->GetArray()) {
echo $row['title'];
}
$dsql->Close();
?>
使用 GetTopid() 函数 (获取顶级栏目ID)
有时候你可能需要获取的是当前栏目所属的顶级栏目的 ID,而不是它本身的 ID,这时可以使用内置的 GetTopid() 函数。
适用场景:
- 在一个多级栏目(如“新闻” > “国内新闻” > “北京新闻”)的列表页或内容页,但你希望获取顶级栏目“新闻”的 ID。
示例代码:
<?php // 获取当前栏目的顶级栏目ID $topTypeId = GetTopid(); echo "当前栏目的顶级栏目ID是:" . $topTypeId; ?>
通过 SQL 查询获取栏目信息 (适用于特定情况)
如果你不仅需要 ID,还需要栏目的其他信息(如栏目名称、栏目别名、描述等),或者你需要在非标准页面(如首页、自定义页面)中获取某个特定栏目的信息,可以通过 SQL 查询来实现。
适用场景:
- 在首页 (
index.php) 调用指定栏目的内容。 - 需要获取当前栏目的详细信息,而不仅仅是 ID。
示例代码:
<?php
// 1. 获取当前栏目ID (和方法一一样)
$currentTypeId = $typeid;
// 2. 通过ID查询栏目的完整信息
$dsql = new DedeSql(false);
$sql = "SELECT id, typename, typedir, description FROM `dede_arctype` WHERE id = '$currentTypeId'";
$row = $dsql->GetOne($sql);
// 3. 检查查询结果是否为空
if (is_array($row)) {
echo "栏目ID: " . $row['id'] . "<br>";
echo "栏目名称: " . $row['typename'] . "<br>";
echo "栏目目录: " . $row['typedir'] . "<br>";
echo "栏目描述: " . $row['description'] . "<br>";
} else {
echo "未找到栏目ID为 " . $currentTypeId . " 的栏目。";
}
$dsql->Close();
?>
在自定义页面中获取栏目ID
如果你创建了一个自定义的页面(my_page.php),并且希望这个页面能根据 URL 中的参数来显示不同栏目的内容,你需要手动获取 URL 中的 ID。
你的 URL 是 http://www.yoursite.com/my_page.php?typeid=5。
示例代码 (在 my_page.php 文件中):
<?php
// 获取URL中传递的typeid参数
$currentTypeId = isset($_GET['typeid']) ? (int)$_GET['typeid'] : 0;
if ($currentTypeId > 0) {
echo "你请求的栏目ID是:" . $currentTypeId;
// 使用这个ID进行查询
$dsql = new DedeSql(false);
$sql = "SELECT * FROM `dede_archives` WHERE typeid = '$currentTypeId' LIMIT 5";
$dsql->SetQuery($sql);
$dsql->Execute();
while ($row = $dsql->GetArray()) {
echo "<a href='" . $row['arcurl'] . "'>" . $row['title'] . "</a><br>";
}
$dsql->Close();
} else {
echo "请指定一个栏目ID,?typeid=5";
}
?>
总结与最佳实践
| 方法 | 函数/变量 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| 方法一 | $typeid |
列表页、内容页、栏目页 (最常用) | 最简单、最直接、效率最高 | 仅适用于 DedeCMS 已确定上下文的页面 |
| 方法二 | GetTopid() |
需要获取顶级栏目ID时 | 方便快捷,无需手动判断 | 只能获取顶级ID |
| 方法三 | SQL 查询 | 需要栏目详细信息时 | 灵活,可获取任意栏目数据 | 代码稍多,需要手动处理SQL |
| 方法四 | $_GET['typeid'] |
自定义页面,通过URL传参 | 极其灵活,可自由控制 | 需要手动验证和过滤参数,安全性需注意 |
核心建议:
- 99% 的情况下,直接使用
$typeid就足够了。 这是最符合 DedeCMS 设计思想的方式。 - 如果你的网站有复杂的栏目层级,并且需要在子栏目页面调用顶级栏目的模板或数据,请使用
GetTopid()。 - 在自定义 PHP 页面中,务必记得对从
$_GET获取的 ID 进行类型转换(如(int))和安全过滤,防止 SQL 注入。
