如何使用Walker_Nav_Menu排除/删除子菜单

时间:2013-03-10 作者:MaxxDinh

我正在使用自定义菜单和扩展的Walker\\u Nav\\u菜单类在新站点上工作,以向wp Nav菜单添加自定义内容。

我在wordpress admin的菜单中注册了一个自定义选择框(键:my\\u custom\\u menu),请看下图:

http://i.stack.imgur.com/JYb9u.jpg

我的问题是:如果用户使用自定义菜单而不是多级子菜单,是否有办法删除/排除子菜单,例如:

//conditional for parent menu item Contact us
if($menu_item->my_custom_menu !== \'none\'){

    //Remove all the nested submenu with depth != 0 (including <ul class="submenu">)
    // so the expecting result is : remove all submenus inside Contact us .

}
我知道Walker类中有一个名为display\\u element()的函数,但我不知道如何使用它。

2 个回复
SO网友:Lê Phan Đức Trọng

过滤器“wp\\u nav\\u menu\\u objects”将有助于:

add_filter( \'wp_nav_menu_objects\', \'remove_sub_items\', 10, 2 );
function remove_sub_items( $items,$args ) {
    $new_items = array();
    for ($i=1;$i<count($items)+1;$i++){

        //is lvl0
        if(empty($items[$i]->menu_item_parent)){
           $new_items= array_merge($new_items, nav_tree($items[$i],$items));
        }

    } 
  // var_dump($new_items); die();
    if( $args->theme_location == \'primary\' )
        return $new_items; 
    return $items;   
}

function nav_tree($parent,$items){
      $rtn = array();
      $rtn[] = $parent;
      //Edit this conditional, return menu level 0 if has custom menu
      if($parent->my_custom_menu && $parent->my_custom_menu !== \'none\') return $rtn;
      for ($i=1;$i<count($items)+1;$i++){
         if($items[$i]->menu_item_parent && $items[$i]->menu_item_parent == $parent->ID)
        {
            $rtn= array_merge($rtn,nav_tree($items[$i],$items));

        }

      }
      return $rtn;
}

SO网友:MaxxDinh

只有深度为2、3、4的嵌套菜单。。。现在,有没有修改循环的想法?我已将上述代码修改为:

add_filter( \'wp_nav_menu_objects\', \'remove_sub_items\', 10, 2 );
function remove_sub_items( $items,$args ) {
    $new_items = array();
    for ($i=1;$i<count($items)+1;$i++){

        //is child
        if($items[$i]->menu_item_parent && $items[$i]->menu_item_parent != 0)
        {
            for ($j=1;$j<count($items)+1;$j++){
                if($items[$j]->ID == $items[$i]->menu_item_parent && $items[$j]->my_custom_menu == \'none\'){
                    $new_items[]=$items[$i];   
                }
            }
        }
        else{
            $new_items[]=$items[$i];
        }

    } 
    //var_dump($new_items); die();
    if( $args->theme_location == \'primary-menu-nav\' )
        return $new_items; 
    return $items;   
}

结束

相关推荐

Change sub-menu css class

我使用带有下拉菜单的自定义菜单。我想制作两个不同的下拉菜单,每个都有不同的样式。Wordpress使用class=\"sub-menu\". 但我需要为每个菜单设置不同的类别。<ul> <li>Item 1</li> <li>Item 2</li> <li>Item 3 <ul class=\"sub-menu\"> <li>Sub menu item 1