为什么我的WP_NAV_MENU没有返回FALSE?

时间:2013-07-03 作者:Angus Russell

我正在使用wp_nav_menu 对于我只想在有子菜单项要显示时显示的子菜单(包括周围的html)。

问题是,函数总是返回菜单项(应该返回时),或者返回空列表(没有显示时)。我需要它(并且认为它会)返回false。

这是我的密码。

// Capture submenu as a variable
$args = array( 
            \'theme_location\' => $in_menu,
            \'echo\'           => \'0\',
            \'sub_menu\'       => true,
            \'fallback_cb\'    => \'coepio_return_false\'
    ); // Note I\'ve also tried \'fallback_cb\' => false with the same result
$submenu = wp_nav_menu( $args );

// If the menu exists
if( $submenu ) {
    ?>
    <div id="submenu" class="sidebar cf" role="navigation">

        <div class="widget">
            <div id="submenu-title" class="widget-title">
                <h4>In This Section</h4>
            </div>
            <div class="widget-content">
                <?php 
                echo $submenu;
                ?>
            </div>
        </div>

    </div><!-- #submenu -->
    <?php
}
如果你注意到了\'sub_menu\' => true 你有一双好眼睛。这是代码。

// Submenus - required for the submenu (above) to work
// filter_hook function to react on sub_menu flag
function coepio_submenu( $sorted_menu_items, $args ) {
  if ( isset( $args->sub_menu ) ) {
    $root_id = 0;

    // find the current menu item
    foreach ( $sorted_menu_items as $menu_item ) {
      if ( $menu_item->current ) {
        // set the root id based on whether the current menu item has a parent or not
        $root_id = ( $menu_item->menu_item_parent ) ? $menu_item->menu_item_parent : $menu_item->ID;
        break;
      }
    }

    $menu_item_parents = array();
    foreach ( $sorted_menu_items as $key => $item ) {
      // init menu_item_parents
      if ( $item->ID == $root_id ) $menu_item_parents[] = $item->ID;

      if ( in_array( $item->menu_item_parent, $menu_item_parents ) ) {
        // part of sub-tree: keep!
        $menu_item_parents[] = $item->ID;
      } else {
        // not part of sub-tree: away with it!
        unset( $sorted_menu_items[$key] );
      }
    }

    return $sorted_menu_items;
  } else {
    return $sorted_menu_items;
  }
}
add_filter( \'wp_nav_menu_objects\', \'coepio_submenu\', 10, 2 );

2 个回复
SO网友:Milo

它不会返回false,因为菜单在任何情况下都存在,您只需取消设置所有菜单项。您没有设置items_wrap arg,因此默认为ul 包装器。可以尝试通过将其显式设置为仅子项来删除它:

\'items_wrap\' => \'%3$s\'
注意,然后您必须手动包装菜单ul 这种情况下的标签。

SO网友:Eric K

我遇到了这个问题,我的bug来自于我写错的其他代码。我有以下代码处理$查询:

function qd_post_queries( $query ) {
  if(is_tax(\'qd_locations\')){
    $query->set(\'post_type\',\'qd_program\');
  }
}
add_action( \'pre_get_posts\', \'qd_post_queries\' );
这导致了对分类法页面上的每个查询的劫持,包括对导航的调用。我需要添加is_main_query()if 要解决此问题,请执行以下操作:

if(is_tax(\'qd_locations\') && $query->is_main_query())

结束

相关推荐

Custom menus not showing

作为我上一次关于菜单的未解决查询的后续,这个问题已经进一步扩展。我的菜单没有打印代码中的任何地方。我正在注册菜单功能。php:add_action( \'after_setup_theme\', \'your_newtheme_setup\' ); if ( ! function_exists( \'your_newtheme_setup\' ) ) : function your_newtheme_setup() { if (