WordPress:获取当前页面菜单的current menu item,输出在菜单中的子菜单get sub menu

来源: 老季博客
日期: 2022-7-21
作者: 腾讯云/服务器VPS推荐评测/Vultr
阅读数: 54

遇到一个问题,要显示当前页面的面包屑导航,只是这个面包屑路径反应的不是页面自身的层级关系,而是该页面在菜单导航中的位置。因此需要检测该页面所在菜单的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>';
}
链接到文章: https://jiloc.com/47842.html

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注