在列表页和文章页(最常用)
这是最核心、最常用的方法,织梦系统在处理列表页和文章内容页时,会自动将当前栏目的ID存入一个全局变量中。

(图片来源网络,侵删)
核心变量:
$typeid
这个变量在列表页(list_article*.php)和文章页(article_article*.php)中都是自动可用的,它存储的就是当前栏目的ID。
场景1:在列表页模板(list_article.htm)中调用
你想在列表页的标题上方显示“您正在浏览的是 [栏目名称] 栏目”,并且需要用到栏目ID。
<h2>您正在浏览的是:[field:typename /] 栏目</h2>
<p>当前栏目ID是:{dede:field.typeid/}</p>
{dede:list pagesize='10'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:list}
代码解释:

(图片来源网络,侵删)
{dede:field.typeid/}:这是最直接的调用方式,直接输出当前栏目的ID。typeid也可以用在其他标签中,例如在{dede:arclist}标签里,如果你想在子列表中调用父级ID,但通常field.typeid就足够了。
场景2:在文章内容页模板(article_article.htm)中调用
在文章页,你可能想显示文章所属的栏目信息,或者将栏目ID传递给某些JS函数。
<h1>[field:title/]</h1>
<div class="info">
<span>来源:[field:source/]</span>
<span>作者:[field:writer/]</span>
<span>发布时间:[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
<span>栏目ID:<strong>{dede:field.typeid/}</strong></span>
<span>栏目名:<strong>{dede:field.typename/}</strong></span>
</div>
<div class="content">
[field:body/]
</div>
代码解释:
- 同样使用
{dede:field.typeid/}来获取当前文章所在栏目的ID。 {dede:field.typename/}用于获取栏目名称,与ID配合使用非常方便。
在首页、封面页等其他页面
在首页或者自定义的封面页等非列表/文章页,$typeid 变量是空的,如果你需要在这些页面获取某个指定栏目的ID,有几种方法。
场景3:通过自由列表(Free Channel)获取
这是最规范、最推荐的方法,尤其适合在首页等位置调用。
-
在后台创建自由列表:
- 登录织梦后台 -> 核心 -> 频道模型 -> 自由列表管理。
- 点击“增加自由列表”,填写列表名称(首页产品推荐”)。
- 在“指定栏目”部分,选择你想要调用其ID的那个栏目,你可以选择单个栏目,也可以选择多个。
- 其他选项根据需要填写,然后保存。
-
在模板中调用:
- 在首页模板中,使用
{dede:freelist}标签来调用你创建的自由列表。 - 在
{dede:freelist}标签内部,你就可以使用{dede:field.typeid/}来获取这个自由列表所指定的栏目ID。
- 在首页模板中,使用
{dede:freelist titlelen='40' row='8'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<p>本条目属于栏目ID: {dede:field.typeid/}</p>
</li>
{/dede:list}
注意:这里的 typeid 指的是自由列表所绑定的那个栏目的ID。
场景4:通过SQL查询直接获取
如果你对PHP和SQL有一定了解,可以直接在模板中使用 dede:sql 标签进行查询。
假设你知道栏目的目录(typedir),product,你可以通过它来查询ID。
{dede:sql sql="Select id From `dede_arctype` where typedir like '%product%'"}
当前栏目的ID是:[field:id/]
{/dede:sql}
缺点:
- 不够灵活,需要硬编码目录名。
- 如果有多个栏目目录名相似,可能会查询到多个结果,处理起来比较麻烦。
- 不推荐常规使用,仅在特殊情况下考虑。
在PHP代码文件中获取
如果你在自定义的PHP文件(比如一个自定义的页面模板 my_page.php)中需要获取当前栏目ID,你需要手动获取。
<?php
require_once(dirname(__FILE__)."/include/common.inc.php");
// 获取当前栏目ID
// 如果是通过栏目链接进入的,index.php?tid=5
$typeid = isset($typeid) ? intval($typeid) : 0;
// 如果是直接访问的页面,没有tid参数,你可能需要其他逻辑来获取
// 如果你知道栏目ID是固定的
// $typeid = 1;
if($typeid > 0) {
// 使用这个ID查询栏目信息
$typeInfo = $dsql->GetOne("SELECT * FROM `#@__arctype` WHERE id = '$typeid'");
if(is_array($typeInfo)) {
echo "栏目名称是:" . $typeInfo['typename'];
echo "<br>";
echo "栏目ID是:" . $typeInfo['id'];
}
} else {
echo "未指定栏目ID";
}
?>
总结与对比
| 场景 | 推荐方法 | 核心代码 | 说明 |
|---|---|---|---|
列表页 (list_*.htm) |
直接调用系统变量 | {dede:field.typeid/} |
最简单、最常用,系统自动提供。 |
文章页 (article_*.htm) |
直接调用系统变量 | {dede:field.typeid/} |
同上,用于获取文章所属栏目的ID。 |
| 首页/封面页 | 自由列表 | {dede:freelist}...{dede:field.typeid/}...{/dede:freelist} |
最规范的方法,适合在首页调用指定栏目的内容并获取其ID。 |
| 首页/封面页 | SQL查询(备选) | {dede:sql}...[field:id/]{/dede:sql} |
灵活性差,容易出错,仅在不方便使用自由列表时使用。 |
| PHP代码文件 | 手动获取 $typeid 变量 |
$typeid = isset($typeid) ? intval($typeid) : 0; |
用于开发自定义功能时,在PHP层面获取ID。 |
核心要点:
{dede:field.typeid/} 这个标签,它能在90%的情况下解决你的问题,如果它不起作用,说明你可能不在列表页或文章页,此时应考虑使用自由列表的方法。
