使用 typeid 排除参数(最推荐、最灵活)
这是最常用且最灵活的方法,适用于几乎所有使用 {dede:arclist} 和 {dede:channelartlist} 等标签调用内容的地方,核心思想是在调用标签时,使用 typeid 参数来指定你想要显示的栏目ID,并用逗号隔开。

找到要排除的栏目ID
你需要知道哪些栏目的ID是你不想显示的。
- 登录 DedeCMS 后台。
- 进入【栏目】->【栏目管理】。
- 将鼠标悬停在你想要排除的栏目名称上,浏览器状态栏或链接的
href属性中会显示typeid=X,这个X就是该栏目的 ID,记下这些 ID。
你不想显示 ID 为 5 (关于我们) 和 6 (联系我们) 的栏目。
在模板文件中使用 typeid 参数

打开你想要修改的模板文件(index.htm、list_article.htm 等),找到调用文章列表的标签,如 {dede:arclist}。
修改前 (默认调用所有子栏目):
{dede:arclist titlelen='30' row='10'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:arclist}
修改后 (排除指定栏目):
假设你的主栏目 ID 是 1,你想在它的首页显示除 5 和 6 外的所有子栏目内容,你需要将 typeid 设置为 1(表示只调用 1 的子栏目),然后用 notypeid 排除。
{dede:arclist typeid='1' notypeid='5,6' titlelen='30' row='10'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:arclist}
参数说明:

typeid='1': 指定只调用 ID 为 1 的栏目及其所有子栏目的文章,这是关键,它限定了范围。notypeid='5,6': 在typeid指定的范围内,再排除掉 ID 为 5 和 6 的栏目。- 注意:
typeid和notypeid通常是配合使用的,如果你只写notypeid而不写typeid,可能会无效或调用全站内容,不符合大多数需求。
适用场景:
- 首页文章列表
- 栏目页文章列表
- 任何需要自定义内容调用的地方
修改 PHP 源文件(适用于首页特定模块)
如果你只想在首页的某个特定模块(如首页主内容区)排除某个栏目,并且不想修改模板标签,可以直接修改 PHP 文件,这种方法针对性强,但升级 DedeCMS 时可能会被覆盖。
场景: 修改首页主内容区 index.php 的文章调用逻辑。
操作步骤:
-
找到文件:
- 打开
include/common.inc.php文件,这个文件通常包含一些全局的函数和配置。 - 在文件中找到
$typeid或类似的变量定义,或者在需要修改的函数(如GetArcList)中查找。
- 打开
-
添加排除逻辑: 在 SQL 查询语句中添加
AND条件来排除指定栏目。原始代码可能类似这样:
// 在某个函数中,如 GetArcList() $query = "SELECT id,typename,typedir,isdefault,isdefault,defaultname,namerule2,moresite,siteurl,sitepath FROM `dede_arctype` WHERE reid='$typeid' And ishidden<>1 order by sortrank asc limit 0, $typeidnum ";修改后,添加
AND id NOT IN (...)条件: 假设我们要排除 ID 为5和6的栏目。// 在某个函数中,如 GetArcList() $query = "SELECT id,typename,typedir,isdefault,isdefault,defaultname,namerule2,moresite,siteurl,sitepath FROM `dede_arctype` WHERE reid='$typeid' And ishidden<>1 AND id NOT IN (5,6) order by sortrank asc limit 0, $typeidnum ";这里的
AND id NOT IN (5,6)就是排除条件。
⚠️ 警告:
- 这种方法直接修改核心文件,有风险。
- 如果你的 DedeCMS 是二次开发版本,不同版本的代码可能不同,需要仔细定位。
- 升级 DedeCMS 时,这个修改会被覆盖,需要重新修改。
使用 channel 标签并设置 typeid(适用于栏目导航)
如果你是在制作首页或栏目页的导航栏,不想让某个导航项显示,可以使用 {dede:channel} 标签并配合 typeid 参数。
修改前 (显示所有顶级栏目):
{dede:channel type='top' row='8'}
<li><a href="[field:typeurl/]">[field:typename/]</a></li>
{/dede:channel}
修改后 (只显示指定的顶级栏目):
假设你只想显示 ID 为 1,2,3,4 的顶级栏目。
{dede:channel typeid='1,2,3,4' type='top' row='8'}
<li><a href="[field:typeurl/]">[field:typename/]</a></li>
{/dede:channel}
这种方法是通过“只包含”来实现“不显示”,而不是“排除”。
总结与推荐
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
typeid + notypeid |
灵活、安全、非侵入式,符合模板分离思想,升级无忧。 | 需要手动在模板中修改。 | 绝大多数情况下的首选,特别是首页、列表页的内容调用。 |
| 修改PHP源文件 | 针对性强,直接修改数据查询逻辑。 | 有风险,可能破坏系统,升级后失效,不推荐普通用户使用。 | 特殊定制需求,且无法通过模板实现时(非常罕见)。 |
channel |
简单直接,专门用于栏目导航。 | 只能通过“包含”来实现“排除”,不够灵活。 | 需要控制导航栏显示哪些栏目时。 |
给你的最终建议:
优先使用方法一,它是最标准、最安全、最可持续的解决方案,花一分钟找到栏目的 ID,然后在模板文件中稍作修改,就能完美解决问题。
