本文约 2,437 字,预计阅读 7 分钟。文中命令与配置均经过实测,可直接参考执行。
引言
网站头部那个熟悉的导航栏突然不见了:要么整条菜单空空的,要么只显示「示例页面」「首页」这种 WordPress 默认菜单,自己精心编辑的栏目全没了。这种情况在更换主题、升级主题、或误点了一次设之后非常典型。很多站长第一反应是「菜单是不是被删了」,其实菜单本身通常还在「外观 → 菜单」里好好存着,只是没有被分配到主题的菜单位置,或者主题换了、菜单位置名称变了,于是前台自然不显示。下面把菜单为什么消失、怎么找回来讲清楚,照着做基本都能恢复,不必重新一个个添加栏目。判断思路也很简单——先看后台菜单本身在不在,再看它有没有被分配到位置,最后才怀疑模板。
故障原因分析
- 菜单未分配到位置:菜单建好了,但没在「显示位置」里勾选「主菜单 / Primary」等主题定义的槽位,前台就不输出。
- 主题注册的菜单位置变了:换主题后,新主题的菜单位置名称与旧主题不同,旧的分配失效,需要重新指定。
- 菜单位置未注册:主题
functions.php里没有register_nav_menus(),外观里根本不出现可分配的位置。 - 模板未调用菜单:主题模板(如
header.php)里缺少wp_nav_menu()输出代码。 - theme_mods 丢失或主题改名:菜单与位置的对应关系存在
theme_mods_{主题}中,主题目录名变化或设置被重置,就会「解散」。 - 多站点或缓存问题:缓存、CDN 仍在输出旧头部,让人误以为菜单没回来。
分步解决方案
方法一:重新把菜单分配到位置(最常见)
- 进入「外观 → 菜单」;
- 在「选择要编辑的菜单」下拉里选中你的菜单(若列表里没有,说明菜单被删了,需重建,见方法三);
- 拉到下方「显示位置」,勾选「主菜单 / Primary Menu」等想要的槽位;
- 点「保存菜单」。
保存后刷新前台,菜单通常立刻出现。换主题后这个动作几乎必做一次。
方法二:让主题注册并输出菜单位置
如果「显示位置」区块是空的,说明主题没注册位置。在子主题的 functions.php 里加:
<?php
add_action( 'after_setup_theme', 'mysite_register_menus' );
function mysite_register_menus() {
register_nav_menus( array(
'primary' => __( '主菜单', 'mysite' ),
'footer' => __( '页脚菜单', 'mysite' ),
) );
}
再确认模板里有输出。把父主题 header.php 复制到子主题后,在需要的位置放:
<?php
wp_nav_menu( array(
'theme_location' => 'primary',
'container' => 'nav',
'menu_class' => 'main-menu',
'fallback_cb' => false,
) );
theme_location 要与注册时的键名(这里是 primary)一致,fallback_cb => false 可避免没菜单时输出默认页面列表。
方法三:菜单确实被删了的重建
如果菜单列表里找不到,就新建一个:外观 → 菜单 → 新建菜单,命名后从左栏把「页面 / 分类 / 自定义链接」勾选「添加到菜单」,拖拽调整层级,再按方法一分配位置并保存。若分类很多,可用「自动添加页面」批量加入再删掉不需要的。菜单支持多层拖拽,做成二级下拉也很方便:把子项向右拖一点缩进即可。
方法四:从备份恢复或对齐 theme_mods
若菜单还在但位置对应关系混乱,且你有数据库备份,可恢复 wp_options 表里 theme_mods_{主题} 的记录。也可像处理 Customizer 一样,把旧主题的 theme_mods_old 改名对齐到新主题——但更稳妥的是直接在界面上重新分配,视觉可见、风险低。
-- 先备份,再查看
SELECT option_name FROM wp_options WHERE option_name LIKE 'theme_mods_%';
方法五:清缓存验证
保存后前端没变化,先强刷(Ctrl+F5),再清 WordPress 缓存插件、服务器 opcache 与 CDN 缓存,然后查看页面源代码里是否出现 <nav class="main-menu">。
常见踩坑点
- 以为菜单被删就重加:多数只是没分配位置,先检查「显示位置」。
- 在父主题注册菜单:更新后丢失,应写子主题
functions.php。 theme_location与注册键名不一致:一个写primary、一个写main,就对不上了。- 忘了
fallback_cb:没分配菜单时会自动输出「页面列表」,看起来像”出错”,实际是未覆盖默认行为。 - 改动不复制模板到子主题:直接改
header.php会被父主题更新覆盖。 - 不清缓存下结论:CDN/浏览器缓存会误导判断,先清再测。
总结
WordPress 导航菜单丢失或不显示,核心多半不在「菜单被删」,而在「位置没分配」和「模板没输出」。修复顺序建议是:先到「外观 → 菜单」把菜单分配到对应位置;位置为空就先让主题用 register_nav_menus() 注册,并在 header.php 里用 wp_nav_menu() 输出,且 theme_location 与注册名一致;菜单真的没了再重建;最后清缓存确认。把菜单注册与模板改动放进子主题,就不会被主题更新冲掉。掌握这套排查,WordPress菜单不显示的问题基本都能在几分钟内解决。
