后台给页脚位置分配了菜单,前台页脚还是一串页面链接,顺序和后台不一样。theme_location 拼写没错,菜单也确实保存了。乍看像缓存或者权限的锅,追下去往往不是。

wp option get theme_mods_yourtheme --format=json | grep -A5 nav_menu_locations
wp_nav_menu(['theme_location' => 'footer', 'fallback_cb' => false]);

追下去是这么回事:wp_nav_menu 在找不到菜单时用 fallback_cb 输出 wp_page_menu,默认行为就是列出所有页面。位置注册了但菜单没真正绑定到这个 location,就会走兜底。

「wp_nav_menu fallback」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

具体做法是,打印 wp_get_nav_menu_locations 确认 footer 的 term_id 不是 0;后台重新保存一次位置分配 有时提交没写进 option;输出时把 fallback_cb 设成 false 让问题暴露。

验收就看一点,页脚输出的是后台配置的菜单项,不再出现全部页面列表。

作者 9823189