如何解决WordPress中wp_nav_menu生成无内容空a标签的问题
异常输出代码示例:
<ul id="menu-main-menu" class="menu"> <a href="http://localhost:8888/sh"></a> <li><a href="http://localhost:8888/sh"></a> <a href="http://localhost:8888/sh/index.php/sample-page/"> <img class="menuImg" src="http://localhost:8888/sh/wp-content/uploads/2021/03/IMG_0275-150x150.jpg" alt="Sample Page"> <span class="img_text">Sample Page</span> </a> </li>
常见原因及修复方案
- 原因1:后台菜单存在空白菜单项
进入后台「外观」→「菜单」,检查当前启用的菜单列表,是否存在没有填写菜单标题、仅绑定了首页链接的空菜单项,直接删除该类菜单项即可解决。 - 原因2:自定义菜单Walker类逻辑错误
当前菜单包含图片自定义展示,大概率是使用了自定义的Walker类重写了菜单输出逻辑,检查Walker类的start_el方法,是否存在重复输出a标签的问题:比如默认逻辑已经输出了首页菜单项的a标签,自定义的带图片的链接逻辑没有覆盖原有输出,而是新增了一个a标签,导致原有空a标签残留。
验证方法:临时移除自定义Walker参数,使用wp_nav_menu默认参数测试,如果空a标签消失,即可定位是Walker代码问题,修正重复输出的逻辑即可。 - 原因3:菜单钩子函数异常输出
检查主题functions.php以及已启用插件的代码,排查是否有挂载到wp_nav_menu_items、nav_menu_item_args等菜单相关钩子的自定义函数,是否存在未做条件判断就额外输出a标签的逻辑。
快速兜底修复方案
如果暂时无法定位问题根源,可以在主题functions.php中添加以下代码,直接过滤掉所有空a标签:
add_filter('wp_nav_menu_items', function ($menu_html) { // 正则匹配所有内容为空的a标签并移除 return preg_replace('/<a\s[^>]*>\s*<\/a>/i', '', $menu_html); }, 999);
该代码优先级设为999,会在菜单输出前做最终过滤,不会影响正常带内容的a标签展示。
内容的提问来源于stack exchange,提问作者Nephets Naharnah
相关产品推荐
相关产品推荐

