WordPress菜单链接为空,无法显示标题与属性求助
WordPress菜单异常排查与修复方案
问题现象
菜单可识别添加的菜单项数量,但无法显示标题和正确属性,生成的HTML结构如下:
<ul class="art-hmenu menu-8"> <li class="menu-item-"><a></a> </li> <li class="menu-item-"><a></a> </li> </ul>
尝试过的无效代码
从Stack Overflow参考的代码,未解决问题:
//register menu function register_my_menus() { register_nav_menus( array('main-menu' => __( 'Main Menu' ) ) ); } add_action( 'init', 'register_my_menus' ); //template usage <?php wp_nav_menu( array( 'theme_location' => 'main-menu' ) ); ?> //code for adding new menu items function new_nav_menu_items($items, $args) { if( $args->theme_location == 'primary' ){ $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>'; $items = $homelink . $items; } return $items; } add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );
当前头部菜单代码
<?php if (theme_get_option('theme_use_default_menu')) { wp_nav_menu( array('theme_location' => 'primary-menu') );} else { ?><nav class="art-nav"> <div class="art-nav-inner"></div> <?php echo theme_get_menu(array( 'source' => theme_get_option('theme_menu_source'), 'depth' => theme_get_option('theme_menu_depth'), 'menu' => 'primary-menu', 'class' => 'art-hmenu' ) ); get_sidebar('nav'); ?>
theme_get_menu函数代码
function theme_get_menu($args = '') { $args = apply_filters( 'wp_nav_menu_args', $args ); $nav_menu = apply_filters( 'pre_wp_nav_menu', null, $args ); if ( null !== $nav_menu ) { return $nav_menu; } $args = wp_parse_args($args, array('source' => 'Pages', 'depth' => 0, 'menu' => null, 'class' => '')); $source = &$args['source']; $menu = &$args['menu']; $class = &$args['class']; if ($menu != null && is_string($menu)) { // theme location $location = theme_get_array_value(get_nav_menu_locations(), $menu); if ($location) { $menu = wp_get_nav_menu_object($location); if ($menu) { $source = 'Custom Menu'; $class = implode(' ', array($class, 'menu-' . $menu->term_id)); } } } if ($source == 'Custom Menu' && $menu != null) { $nav_menu = theme_get_list_menu($args); } elseif ($source == 'Pages') { $nav_menu = theme_get_list_pages(array_merge(array('sort_column' => 'menu_order, post_title'), $args)); } elseif ($source == 'Categories') { $nav_menu = theme_get_list_categories(array_merge(array('title_li' => false), $args)); } return apply_filters( 'wp_nav_menu', $nav_menu, $args ); }
排查与修复步骤
1. 统一菜单位置注册与调用
你注册的菜单位置是main-menu,但主题代码中实际调用的是primary-menu,位置不匹配导致原生菜单函数无法正确获取菜单数据。修改注册代码为:
function register_my_menus() { register_nav_menus( array('primary-menu' => __( 'Primary Menu' ) ) ); } add_action( 'init', 'register_my_menus' );
如果需要保留添加首页链接的功能,同步修改对应函数的位置判断:
function new_nav_menu_items($items, $args) { if( $args->theme_location == 'primary-menu' ){ $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>'; $items = $homelink . $items; } return $items; } add_filter( 'wp_nav_menu_items', 'new_nav_menu_items', 10, 2 );
2. 修复theme_get_list_menu函数(核心问题)
当主题识别到自定义菜单时,会调用theme_get_list_menu($args)生成菜单HTML,但你未提供这个函数的代码——它大概率没有正确提取菜单项的标题和链接属性。找到该函数并修改为以下逻辑:
function theme_get_list_menu($args) { // 获取菜单下的所有项目 $menu_items = wp_get_nav_menu_items($args['menu']->term_id); if (empty($menu_items)) return ''; $output = '<ul class="' . esc_attr($args['class']) . '">'; foreach ($menu_items as $item) { // 正确拼接菜单项的ID、链接和标题 $output .= sprintf( '<li class="menu-item-%d"><a href="%s">%s</a></li>', esc_attr($item->ID), esc_url($item->url), esc_html($item->title) ); } $output .= '</ul>'; return $output; }
原函数如果没有正确获取$item->title和$item->url,就会生成空的<a>标签和不完整的menu-item-类。
3. 检查主题选项设置
- 进入WordPress后台「外观」→「自定义」,找到主题菜单相关设置:
- 若开启
theme_use_default_menu,需确保primary-menu位置已分配了创建好的菜单; - 若关闭该选项,需将
theme_menu_source设置为「Custom Menu」,并确认对应菜单已绑定到primary-menu位置。
- 若开启
4. 临时替代方案(快速修复)
如果暂时无法定位theme_get_list_menu的问题,可以直接用WordPress原生菜单函数替代主题自定义函数,修改头部代码:
<nav class="art-nav"> <div class="art-nav-inner"></div> <?php wp_nav_menu( array( 'theme_location' => 'primary-menu', 'menu_class' => 'art-hmenu' ) ); get_sidebar('nav'); ?> </nav>
内容的提问来源于stack exchange,提问作者Niels Voorn
相关产品推荐
相关产品推荐

