下面我将从最常见到最罕见的顺序,为你提供一套详细的排查和解决方案,请按照步骤逐一检查。

(图片来源网络,侵删)
第一步:检查网站根目录下的 templets 目录权限
这是最容易被忽略但又非常关键的一步,织梦系统需要动态编译模板文件,并将编译后的缓存文件(.php 文件)存放在 templets 目录下。
- 通过FTP或主机控制面板,进入你的网站根目录。
- 找到
templets文件夹。 - 设置其权限为 755,如果还是不行,可以尝试设置为 777(临时设置,排查问题后务必改回755,否则有安全风险)。
为什么重要? templets 目录没有写入权限,DedeCMS无法生成二级菜单的缓存文件,导致菜单无法显示。
第二步:检查并更新网站缓存
织梦菜单的显示严重依赖缓存,如果缓存文件损坏或未生成,二级菜单自然不会出现。
- 登录你的 DedeCMS 后台。
- 在左侧菜单栏找到 “系统” -> “一键更新网站”。
- 在打开的页面中,勾选 “更新HTML” 和 “更新所有栏目/文档”。
- 点击 “开始更新” 按钮,这个过程会重新生成网站的各种缓存,包括菜单缓存。
为什么重要? 这是最直接的修复方法,能解决大部分因缓存问题导致的菜单不显示。

(图片来源网络,侵删)
第三步:检查模板文件中的调用代码
这是核心部分,二级菜单能否显示,完全取决于你调用的标签是否正确,最常见的错误是调用了错误的标签或缺少必要的参数。
确认你使用的是正确的二级菜单标签
织梦有专门的二级菜单调用标签,而不是 {dede:channel},请检查你的模板文件(通常是 head.htm 或 header.htm)中,一级菜单和二级菜单的调用代码。
正确的调用方式示例:
<!-- 一级菜单 -->
<ul id="nav">
<li><a href="{dede:global.cfg_cmsurl/}/">首页</a></li>
{dede:channelartlist typeid='top' row='8'}
<li>
<a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a>
<!-- 二级菜单开始 -->
<ul class="subnav">
{dede:channel type='son' noself='yes'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
<!-- 二级菜单结束 -->
</li>
{/dede:channelartlist}
</ul>
代码解析:

(图片来源网络,侵删)
{dede:channelartlist typeid='top' row='8'}: 这个标签用于获取顶级栏目。typeid='top'是关键,表示只调用顶级栏目。{dede:field name='typeurl'/}和{dede:field name='typename'/}: 分别输出当前顶级栏目的链接和名称。{dede:channel type='son' noself='yes'}: 这是调用二级菜单的核心标签!type='son': 表示调用当前栏目的子栏目(也就是二级栏目)。noself='yes': 表示不调用栏目本身,只调用子栏目。
[field:typelink/]和[field:typename/]: 在{dede:channel}循环内部,用这个语法来输出子栏目的链接和名称。
常见错误代码排查
- 错误1:在顶级栏目循环里使用了
{dede:channel}而没有type='son'这样会调用出所有栏目,而不是二级菜单。 - 错误2:使用了过时的或错误的标签 请确保你的代码是上面示例中的标准写法。
第四步:检查CSS样式问题
菜单数据其实已经成功加载了,但因为CSS样式问题被隐藏了。
-
检查浏览器开发者工具:
- 在浏览器中按
F12打开开发者工具。 - 切换到 “Elements”(元素)或 “审查元素” 面板。
- 找到你的二级菜单对应的
<ul class="subnav">(或你自己的类名)。 - 查看它的CSS样式,常见的导致隐藏的样式有:
display: none;(最常见)visibility: hidden;height: 0;或overflow: hidden;- 由于
z-index层级问题被其他元素遮挡。
- 在浏览器中按
-
检查鼠标悬停事件: 二级菜单通常是在鼠标移到一级菜单上时才显示的,请检查你的CSS中是否有正确的
hover伪类样式。
正确的CSS示例:
/* 默认状态下,二级菜单隐藏 */
#nav .subnav {
display: none;
position: absolute; /* 通常需要绝对定位 */
list-style: none;
margin: 0;
padding: 0;
background-color: #f5f5f5;
}
/* 当鼠标移到一级菜单的 <li> 上时,显示二级菜单 */
#nav li:hover .subnav {
display: block;
}
/* 二级菜单里的列表样式 */
#nav .subnav li {
width: 150px;
border-bottom: 1px solid #ddd;
}
第五步:检查栏目数据本身
如果以上所有步骤都正确,但菜单仍然不显示,可能是数据本身的问题。
-
检查栏目层级:
- 登录DedeCMS后台,进入 “频道” -> “栏目管理”。
- 查看你的二级栏目是否真的设置为了某个一级栏目的“栏目选择”或“上级栏目”,如果二级栏目的“上级栏目”是“无”或者根目录,那么它就不会被作为二级菜单调用出来。
-
检查栏目是否被禁用:
- 在栏目管理中,检查每个一级和二级栏目是否都处于“启用”状态,如果被禁用了,自然不会显示。
第六步:检查JS文件冲突
如果你的网站加载了多个JavaScript库(如 jQuery, Mootools 等),或者某个JS文件有错误,可能会干扰到菜单的正常渲染。
- 暂时禁用所有JS:在浏览器开发者工具的 “Network”(网络)面板中,勾选 “Disable cache” (禁用缓存),然后刷新页面,看看二级菜单是否出现,如果出现了,说明就是JS冲突问题。
- 逐一排查:通过注释或重命名的方式,临时移除网站加载的JS文件,直到找到导致冲突的那个文件。
总结与排查清单
如果二级菜单不显示,请按以下清单逐一核对:
| 检查项 | 具体操作 | 解决方案 |
|---|---|---|
| 目录权限 | 检查网站根目录下的 templets 文件夹权限。 |
设置为 755,不行则临时 777。 |
| 系统缓存 | 进入后台,执行“一键更新网站”。 | 更新所有栏目和文档,重新生成缓存。 |
| 模板代码 | 检查调用二级菜单的标签是否为 {dede:channel type='son'}。 |
使用正确的标签和循环结构。 |
| CSS样式 | 用F12检查二级菜单元素是否被 display:none 或其他样式隐藏。 |
修正CSS,确保 hover 事件能正常触发显示。 |
| 栏目数据 | 检查后台“栏目管理”,确认二级栏目的“上级栏目”设置正确且已启用。 | 修正栏目的层级关系,并启用栏目。 |
| JS冲突 | 暂时禁用网站所有JS文件,观察菜单是否恢复。 | 找出冲突的JS文件并修复或替换。 |
按照这个流程,99%的DedeCMS二级菜单不显示问题都可以得到解决,祝你成功!
