- 后台栏目列表:在【核心】->【栏目管理】中,希望看到所有栏目,包括那些在前端不显示的。
- 前端模板调用:在前台页面使用
{dede:channel}或{dede:channelartlist}等标签时,希望调用出所有(包括隐藏的)栏目。
下面我将针对这两种最常见的情况,提供详细的解决方案。

在后台栏目管理列表中显示隐藏的栏目
在默认情况下,后台的栏目管理列表已经会显示所有栏目,包括“隐藏”的,但如果你发现某个隐藏的栏目没有显示,或者你想要一个更清晰的筛选视图,可以这样做:
-
直接查看:登录DedeCMS后台,进入【核心】->【栏目管理】,这里默认会列出所有一级栏目,如果你创建的隐藏栏目是二级或更深层级的,你需要点击其父栏目左侧的 号来展开查看。
-
利用搜索/筛选功能:
- 在后台栏目管理页面,通常会有一个搜索框。
- 你可以尝试不输入任何关键词,直接点击搜索,这通常会列出所有栏目。
- 有些版本的DedeCMS可能会有“仅显示隐藏栏目”或类似的筛选选项,但通常不常见,最直接的方法就是展开所有父栏目来查找。
后台默认是显示所有栏目的,如果看不到,大概率是层级没有展开。

在前端模板中调用并显示隐藏的栏目
这是最常见的需求,默认情况下,{dede:channel} 等标签会自动过滤掉 ishidden 字段为 1 的隐藏栏目。
要解决这个问题,你需要修改DedeCMS的核心文件。操作前务必备份原文件!
修改 include/taglib/channel.lib.php 文件(推荐)
这是最常用且最安全的方法,因为它只影响你调用标签时的行为,不会改变系统的核心逻辑。
-
找到文件:
include/taglib/channel.lib.php
(图片来源网络,侵删) -
打开文件,找到以下这段代码(大约在第11-16行):
// if($type=='top') // { // $sql = "SELECT id,typename,typedir,isdefault,isdefault,defaultname,namerule2,moresite,siteurl,sitepath,description,keywords,seotitle,ishidden,channeltype,modname,addcon,description,issend FROM `dede_arctype` WHERE reid=0 And ishidden<>1 order by sortrank asc"; // } // elseif($type=='son') // { // $sql = "SELECT id,typename,typedir,isdefault,isdefault,defaultname,namerule2,moresite,siteurl,sitepath,description,keywords,seotitle,ishidden,channeltype,modname,addcon,description,issend FROM `dede_arctype` WHERE reid='$reid' And ishidden<>1 order by sortrank asc"; // }你会发现,这段代码被注释掉了(前面有 ),实际起作用的是下面
else分支里的代码。 -
修改SQL查询语句: 继续往下看,找到
else分支里的SELECT语句(大约在第20行左右),这是默认的查询逻辑:else { $sql = "SELECT id,typename,typedir,isdefault,isdefault,defaultname,namerule2,moresite,siteurl,sitepath,description,keywords,seotitle,ishidden,channeltype,modname,addcon,description,issend FROM `dede_arctype` WHERE reid='$reid' order by sortrank asc"; }在这个
WHERE条件中,没有ishidden<>1的限制,理论上,这里的channel标签已经可以调用出隐藏栏目了。问题根源:如果你使用了
type='top'或type='son',那么你看到的虽然是注释掉的代码,但DedeCMS在某些版本或特定情况下可能会优先执行这些逻辑,最稳妥的方法是确保所有分支都去掉ishidden的限制。修改方案:
- 方案A(简单粗暴):将所有
SELECT语句中的And ishidden<>1全部删除,包括被注释掉的那些,以防万一。 - 方案B(更推荐):给
{dede:channel}标签添加一个自定义属性,来强制显示隐藏栏目,这需要修改标签解析函数。
这里我们采用方案A,因为它最直接有效。
修改后的代码应该是这样的(注意删除了所有
ishidden<>1):// if($type=='top') // { // $sql = "SELECT id,typename,typedir,isdefault,isdefault,defaultname,namerule2,moresite,siteurl,sitepath,description,keywords,seotitle,ishidden,channeltype,modname,addcon,description,issend FROM `dede_arctype` WHERE reid=0 order by sortrank asc"; // } // elseif($type=='son') // { // $sql = "SELECT id,typename,typedir,isdefault,isdefault,defaultname,namerule2,moresite,siteurl,sitepath,description,keywords,seotitle,ishidden,channeltype,modname,addcon,description,issend FROM `dede_arctype` WHERE reid='$reid' order by sortrank asc"; // } // else // { // $sql = "SELECT id,typename,typedir,isdefault,isdefault,defaultname,namerule2,moresite,siteurl,sitepath,description,keywords,seotitle,ishidden,channeltype,modname,addcon,description,issend FROM `dede_arctype` WHERE reid='$reid' order by sortrank asc"; // }你只需要找到并修改那个正在执行的
else分支里的SQL语句即可,但修改所有分支可以保证万无一失。 - 方案A(简单粗暴):将所有
使用自定义函数(更灵活)
如果你不想修改核心文件,或者你只想在某些特定地方显示隐藏栏目,可以采用自定义函数的方法。
-
创建自定义函数文件: 在
include/extend.func.php文件中(如果此文件不存在,则新建一个)添加以下函数:/** * 调用所有栏目(包括隐藏的) * @param int $reid 父栏目ID,0为顶级 * @param string $type 栏目类型 * @return string 返回栏目列表HTML */ function get_all_channel($reid = 0, $type = 'son') { global $dsql; $sql = "SELECT id,typename,typedir,isdefault,defaultname,namerule2,moresite,siteurl,sitepath,description,keywords,seotitle,ishidden,channeltype,modname,addcon,description,issend FROM `#@__arctype` WHERE reid='$reid' "; if ($type == 'top') { $sql = "SELECT id,typename,typedir,isdefault,defaultname,namerule2,moresite,siteurl,sitepath,description,keywords,seotitle,ishidden,channeltype,modname,addcon,description,issend FROM `#@__arctype` WHERE reid=0 "; } $sql .= " ORDER BY sortrank ASC"; $dsql->SetQuery($sql); $dsql->Execute(); $channels = ''; while ($row = $dsql->GetArray()) { $channels .= "<option value='{$row['id']}'>{$row['typename']}</option>"; } return $channels; }注意:
#@__是DedeCMS的数据表前缀,如果你的前缀不是dede_,系统会自动替换。 -
在模板中调用: 在你的模板文件(通常是
templets/目录下的文件)中,像这样使用:<select name="typeid"> <option value="0">请选择栏目</option> {dede:global name='get_all_channel'/} </select>这个例子是生成一个下拉列表,你可以根据需要修改函数,让它返回
{dede:channel}风格的<a>标签列表。
总结与推荐
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
修改 channel.lib.php |
一劳永逸,所有 {dede:channel} 调用都会生效。 |
直接修改核心文件,升级DedeCMS时可能被覆盖。 | 全站都需要显示隐藏栏目的情况。 |
| 自定义函数 | 灵活安全,不影响核心文件,只在需要的地方调用。 | 需要额外编写代码,调用方式稍显复杂。 | 只在个别页面或特定模块需要显示隐藏栏目。 |
对于大多数用户,我推荐使用【方法一:修改 include/taglib/channel.lib.php 文件】,因为它最直接地解决了问题,且操作简单,请务必在操作前备份原文件,以防万一。
