遇到一个问题,要显示当前页面的面包屑导航,只是这个面包屑路径反应的不是页面自身的层级关系,而是该页面在菜单导航中的位置。因此需要检测该页面所在菜单的current menu item,在stackexchange上找到了一个不错的方法,记录一下。
使用wp_nav_menu_objects filter查找current menu item,在调用wp_nav_menu之前先过滤一下这个filter的值,找到current menu item,将需要的信息,例如menu ID,标题或url等,记录到一个全局变量里。等调用完wp_nav_menu后,就可以使用这个全局变量显示信息了。
在当前菜单中做一下记号
add_filter( 'wp_nav_menu_objects', 'uzi_wp_nav_menu_objects' ); function uzi_wp_nav_menu_objects( $sorted_menu_items ) { foreach ( $sorted_menu_items as $menu_item ) { if ( $menu_item->current ) { $_SESSION['uzi_current_menu'] = $menu_item; break; } } return $sorted_menu_items; }
全局变量$_SESSION['uzi_current_menu']
记录了当前菜单的current menu item的标题。
一些比较有用的信息如下
$menu_item->ID - Menu ID $menu_item->title - 该菜单项名称 $menu_item->post_title - Post Title,不一定和菜单项名称相同 $menu_item->url - 固定链接 $menu_item->object_id - post ID $menu_item->post_parent - Post Parent(例如page的parent page) $menu_item->menu_item_parent - 指在该菜单中的层级关系
输出main-nav菜单中,当前页面所在菜单的子菜单
$locations = get_nav_menu_locations();
$menu = wp_get_nav_menu_object($locations['main-nav']); // primary' is our nav menu's name
$menu_items = wp_get_nav_menu_items($menu->term_id);
// var_dump($menu,$_SESSION['uzi_current_menu']->ID,$menu_items);
if (!empty($menu_items)) {
echo '<ul>';
foreach ($menu_items as $menu_item) {
if($menu_item->menu_item_parent == $_SESSION['uzi_current_menu']->ID
|| $menu_item->menu_item_parent == $_SESSION['uzi_current_menu']-> if ($menu_item->menu_item_parent == $_SESSION['uzi_current_menu']->ID
|| ($menu_item->menu_item_parent == $_SESSION['uzi_current_menu']->menu_item_parent && 0 != $menu_item->menu_item_parent)
) {
//判断当前页面是该菜单项的子项
if (is_page($menu_item->object_id) || is_category($menu_item->object_id)) {
echo '<li class="current-menu-item">';
} else {
echo '<li>';
}
echo '<a href="' . $menu_item->url . '">' . $menu_item->title . '</a>';
echo '</li>';
}
}
echo '</ul>';
}