我将从最常见、最可能的原因开始,逐步排查,并提供详细的解决方案。

问题根源分析
“隐藏栏目”在DedeCMS中主要通过一个字段来控制,即 arctype 表(或 dede_arctype)中的 ishidden 字段。
ishidden = 0:表示栏目不隐藏(正常显示)。ishidden = 1:表示栏目隐藏。
前台不显示隐藏栏目的文章,通常是因为调用的标签没有正确地过滤掉 ishidden = 1 的栏目,或者栏目缓存没有更新。
解决方案(按优先级顺序)
检查并更新栏目缓存(最常见)
DedeCMS为了提高性能,会缓存栏目信息,如果你修改了栏目的隐藏属性,但没有更新缓存,前台依然会读取旧的缓存数据,导致修改无效。
操作步骤:

- 登录你的DedeCMS后台。
- 在顶部菜单栏找到 “系统” -> “一键更新网站”。
- 在打开的页面中,找到 “更新栏目缓存” 或类似的选项,勾选它。
- 点击 “开始更新” 或 “执行” 按钮。
为什么有效: 这个操作会清空旧的栏目缓存文件,并重新从数据库中读取所有栏目的最新信息(包括 ishidden 的值),从而让前台页面能识别出哪些栏目是隐藏的。
检查前台调用标签是否正确
即使你更新了缓存,如果你使用的自定义模板标签没有排除隐藏栏目,那么它们依然会被显示出来,DedeCMS官方提供的许多默认标签已经内置了排除隐藏栏目的功能,但如果你使用了复杂的自定义SQL查询,就需要手动添加条件。
使用默认的栏目列表标签(如 {dede:channel})
默认的栏目列表标签通常已经处理了隐藏栏目,但最好检查一下。

-
不带子栏目的栏目列表:
{dede:channel type='top' row='8'} <a href="[field:typelink/]">[field:typename/]</a> {/dede:channel}这个标签默认不显示隐藏的顶级栏目。
-
带子栏目的栏目列表:
{dede:channelartlist type='top' row='2'} <h2><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></h2> <ul> {dede:channel type='son' noself='yes'} <li><a href="[field:typelink/]">[field:typename/]</a></li> {/dede:channel} </ul> {/dede:channelartlist}这个标签也应该默认不显示隐藏的子栏目。
使用文章列表标签(如 {dede:arclist})
这是最关键的一步。{dede:arclist} 标签本身是调用文章,但它会受到其所在栏目(通过模板指定或typeid参数)的限制。 如果一个栏目是隐藏的,而你把 {dede:arclist} 放在这个隐藏栏目的模板里,它自然就不会被正常调用到前台。
解决方案:
- 不要将文章列表模板直接放在隐藏栏目的目录下。
- 正确的做法是,在不隐藏的父栏目的模板里,通过
typeid参数来指定要调用哪个子栏目的文章。
示例: 假设你有一个隐藏的栏目“公司新闻”(ID=5),你想在“关于我们”(ID=3)这个栏目页面上显示“公司新闻”的文章。
- 确保“公司新闻”(ID=5)在后台的“栏目管理”中,
ishidden字段被设置为 1。 - 确保“关于我们”(ID=3)的
ishidden字段设置为 0。 - 编辑“关于我们”(ID=3)的栏目模板(通常是
templets/default/aboutus.htm)。 - 在模板中,使用
typeid参数来指定调用ID为5的栏目文章。
{dede:arclist typeid='5' titlelen='30' row='10'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
重要提示: 如果你的文章列表需要调用多个栏目的文章,并且其中包含隐藏栏目,你需要使用更高级的写法,通过 IN 语法指定栏目ID,但前提是你必须确保这些栏目的模板是可访问的(即它们所在的父栏目不隐藏)。
检查数据库 ishidden 值
如果以上方法都无效,可以手动检查一下数据库,确保数据是正确的。
- 通过phpMyAdmin等工具连接到你的数据库。
- 找到
dede_arctype这张表。 - 执行以下SQL查询,检查你怀疑的那个栏目:
SELECT id, typename, ishidden FROM dede_arctype WHERE id = '你的栏目ID';
查看返回结果中的
ishidden字段值,确认它确实是1。
检查模板文件是否被覆盖
自定义的模板文件可能覆盖了系统默认的、包含正确逻辑的模板,检查一下你正在使用的模板文件,确保它没有错误地移除了过滤隐藏栏目的代码。
总结与排查流程
遇到“Dede不显示隐藏栏目文章”的问题,请按照以下顺序进行排查,这能解决99%以上的情况:
- 第一步(首选): 进入DedeCMS后台,执行 “系统” -> “一键更新网站” -> “更新栏目缓存”,这是最简单也最有效的解决方法。
- 第二步: 检查你调用文章的 模板文件,确认
{dede:arclist}等标签是否放在了正确的、非隐藏的父栏目模板中,并且是否正确使用了typeid参数来指向隐藏的子栏目。 - 第三步: 如果模板逻辑没问题,再手动检查数据库里
dede_arctype表的ishidden字段,确保数据无误。 - 第四步(: 检查模板文件本身是否有语法错误或逻辑错误。
按照这个流程,你应该能顺利解决问题,如果问题依旧存在,可能需要检查是否有非官方的插件修改了核心逻辑,但这属于比较复杂的情况了。
