如何从get_nav_menu_locations创建菜单,当它总是返回一个空数组时


How to create a menu from get_nav_menu_locations when it always returns an empty array?

在wordpress仪表板中,我在外观->菜单下创建了一个菜单,并将其命名为"my-menu"。

使用此页面中的示例代码,我正在尝试构建菜单。在我的/wp-content/themes/blankslate/header.php中添加了以下代码:

$menu_name = 'my-menu';
$locations = get_nav_menu_locations();
print_r ($locations);

基本上,在每一页上,即使我已经创建并保存了菜单,$locations也是一个空数组。希望创建菜单并在自定义字段中具有它的名称,以便每个页面都可以拥有自己的菜单(或者在未提供自定义字段时没有空或默认菜单时没有任何菜单)。

猜我不明白wordpress打算用户使用它的方式,也许它只是某个地方的一个复选框。我确实注意到,当我选中外观 -> 菜单下的框Main Menu时,返回的数组不为空$locations[ $menu_name ]但未设置。

使用带有修改后的空白主题的wordpress 3.6.1。

[更新]函数.php几乎没有更改,register_nav_menus使用以下参数设置:

array( 'main-menu' => __( 'Main Menu', 'blankslate' ) )

我想这就是仪表板上外观 -> 菜单中的Main Menu复选框的来源。注释掉这一行会使Menus一起消失。

    $locations = get_theme_mod( 'nav_menu_locations' );
print_r($locations);

试试这个

in/

wp-content/themes/blankslate/functions.php

function getDefaultMenu(){
  $loc=get_nav_menu_locations();
  $menu = wp_get_nav_menu_object( $loc['main-menu'] );
  return $menu;
}
function getMenu() {
  global $post;
//set menuName to custom field called menu-name
  $menuName = get_post_meta($post->ID, 'menu-name', true);
//menu to use
  $useMenu = false;
//get available menus
  $menus = wp_get_nav_menus();
  //if no custom field was given use default-menu
  // will fail if no menu is set to default
  if (!$menuName) {
    $useMenu=getDefaultMenu();
    if(!$useMenu){
      throw new Exception("Please make one of the menus".
        " the main menu under Appearance => Menus");
    }
    return wp_get_nav_menu_items($useMenu->term_id);
  }
  //find the menu with the $menuName
  // either default-menu or the custom field called menu-name
  foreach ($menus as $menuItem) {
    var_dump ($menuItem);
    if ($menuItem->name === $menuName) {
      $useMenu = $menuItem;
      break;
    }
  }
  //if no menu was found raise an error
  //menu-name must be provided as a custom field
  // or default menu must be set
  if (!$useMenu) {
    throw new Exception("Can't open menu named:" . $menuName .
    " Make sure you set a custom field called menu-name" .
    " with the name of one of the menus under Appearance => Menus".
    " Or set one of the menus to Main Menu.");
  }
  return wp_get_nav_menu_items($useMenu->term_id);;
}

在/wp-content/themes/blankslate/page 中.php

$menu_items=getMenu();
var_dump($menu_items);
$menu_list = '<ul id="menuid">';
foreach ((array) $menu_items as $key => $menu_item) {
  $title = $menu_item->title;
  $url = $menu_item->url;
  $menu_list .= '<li><a href="' . $url . '">' . $title . '</a></li>';
}
$menu_list .= '</ul>';

示例代码不显示如何处理嵌套项,但当我弄清楚那个时,我会更新。