在导航菜单中仅显示给定级别

时间:2015-06-08 作者:myol

我只想在导航主菜单中显示给定级别的菜单项。目前,我的主菜单的子菜单是主菜单HTML的一部分,HTML是导航链接列表中的无序列表。

<ul id="menu-main-top-navigation">
    <li class="menu nav-1">
        ...
        <ul>
            <li class="menu sub-nav-1"></li>
            <li class="menu sub-nav-2"></li>
        </ul>
    </li>
    <li class="menu nav-2">...</li>
    <li class="menu nav-3">...</li>
</ul>
在菜单nav-1的页面上,我想要

<ul id="menu-main-sub-navigation">
    <li class="menu sub-nav-1">...</li>
    <li class="menu sub-nav-2">...</li>
</ul>
目前,我已经编写了一段黑客代码,当页面打开时,它只显示给定菜单项的第二级导航。然而,它不适用于任何给定的级别。

我认为定制步行机是一种方式,但我似乎无法让它发挥作用。。。

EDIT:

这是我的黑客代码,目前只在页面上显示二级子导航;

function submenu_display( $items, $args ) {

    $current_page_id = (string)get_the_ID();
    $top_level       = array();
    $second_level    = array();

    foreach ( $items as $item ) {
        // The parent menu ID is different to the object (post) ID
        if ( $item->object_id === $current_page_id ) {
            $current_parent_id = $item->ID;
        }
        if ( $item->menu_item_parent === \'0\' ) {
            $top_level[ $item->ID ] = $item->object_id;
        }
        if ( array_key_exists( $item->menu_item_parent, $top_level ) ) {
            $second_level[ $item->ID ] = $item->object_id;
        }
    }

    if ( isset( $current_parent_id ) ) {
        if ( array_key_exists( $current_parent_id, $second_level ) ) {
            foreach ( $items as $item => $details ) {
                if ( $current_parent_id === $details->ID ) {
                    $current_parent_id = $details->menu_item_parent;
                }
            }
        }
        if ( array_key_exists( $current_parent_id, $top_level ) ) {
            foreach ( $items as $item => $details ) {
                if ( $details->menu_item_parent != $current_parent_id ) {
                    unset( $items[ $item ] );
                }
            }
        }
    } else {
        $items = array();
    }

    return $items;
}
并通过

add_filter( \'wp_nav_menu_objects\', \'submenu_display\', 10, 2 );

wp_nav_menu( array( \'theme_location\' => \'primary_navigation\',
            \'menu_class\'     => \'nav nav-sub\',
            \'menu_id\'        => \'menu-main-sub-navigation\'
) );

remove_filter( \'wp_nav_menu_objects\', \'submenu_display\', 10 );

2 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

您需要扩展Walker_Nav_Menu 如果我理解的话,它只输出深度不是“零”的项目——顶层。

class my_extended_walker extends Walker_Nav_Menu {
  function start_lvl(&$output, $depth, $args ) {
    if (0 !== $depth) {
      parent::start_lvl($output, $depth, $args);
    }
  }

  function end_lvl(&$output, $depth, $args) {
    if (0 !== $depth) {
      parent::end_lvl($output, $depth, $args);
    }
  }

  function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
    if (0 !== $depth) {
      parent::start_el($output, $item, $depth, $args, $id);
    }
  }

  function end_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
    if (0 !== $depth) {
      parent::end_el($output, $item, $depth, $args, $id);
    }
  }
}
// testing
wp_nav_menu( 
  array( 
    \'walker\'=>new my_extended_walker(),
    \'menu\' => \'mymenu\'
  ) 
);

SO网友:Robbert

也许你可以用wp_get_nav_menu_items() 获取项目,然后检查项目是否有父项。

<?php
$items = wp_get_nav_menu_items( \'header\' );
if( $items ) {
    echo \'<ul id="menu-main-top-navigation">\';
    foreach( $items as $index => $item ) {
        if( $item->menu_item_parent != 0 ) 
            echo \'<li class="menu"><a href="\' . get_permalink( $item->ID ) . \'">\' . $item->post_title . \'</a></li>\';
    }
    echo \'</ul>\';
}
?>

结束

相关推荐

Display all submenus

对于我想显示的自定义jquery菜单all submenus 并根据需要隐藏/显示每个。然而,我的问题是首先显示所有子菜单。截至目前,我正在管理first level 通过admin menu 部分:将菜单项添加到主菜单。显示器的工作原理如下:wp_nav_menu( array ( \'sort_column\' => \'menu_order\' , \'container\' => \'ul\' , \