在您的示例中,“关键行业”页面在每个顶级菜单下都是不同的页面,或者至少URL是不同的。
这很可能使他们的CMS能够区分并使用正确的子菜单。
当我想实现这一目标时,我会这样做:
钩住wp_nav_menu_objects
并检查自定义submenu
参数将在该挂钩内保存父菜单项ID,在调用wp_nav_menu()
, 供应asubmenu
参数,该参数具有要显示的子菜单的父菜单项ID(我将在下面介绍如何执行此操作)
Hooking into wp_nav_menu_objects
and unsetting non-child menu items:
这是我用于此的函数。它将检查submenu
每次调用时的参数wp_nav_menu()
. 如果submenu
设置时,它将继续删除任何不是菜单项ID子项的项,该菜单项IDsubmenu
指:add_filter("wp_nav_menu_objects", "mytheme_submenu_limit", 10, 2);
function mytheme_submenu_limit($items, $args){
if(empty($args->submenu)){ return $items; } // if no submenu arg is set, return immediately
$filtered = wp_filter_object_list($items, array("ID" => $args->submenu), "and", "ID");
$parent_id = array_pop($filtered);
$children = mytheme_submenu_get_children_ids($parent_id, $items);
foreach($items as $key => $item){
if(!in_array($item->ID, $children)){
unset($items[$key]);
}
}
return $items;
}
function my_theme_submenu_get_children_ids($id, $items){
$ids = wp_filter_object_list($items, array("menu_item_parent" => $id), "and", "ID");
foreach($ids as $id){ $ids = array_merge($ids, submenu_get_children_ids($id, $items)); }
return $ids;
}
<小时>Calling wp_nav_menu()
:
当你打电话的时候wp_nav_menu()
, 然后需要添加自定义submenu
参数,例如:wp_nav_menu(array("theme_location" => "my_menu_area", "submenu" => 240));
当然,这里的关键是-如何获得子菜单ID?如果您真的愿意,可以手动执行此操作,但更好的方法是通过搜索当前查询自动确定此ID应该是什么。
基本上,您只需确定当前显示的页面的菜单项ID,然后:
如果该菜单项是顶级菜单项(即父菜单项为0),请将该菜单项ID发送到submenu
参数,或者如果它不是顶级菜单项,则将其父ID发送到submenu
参数这将导致-当然,只要该页面在菜单中使用不超过一次在显示的正确子菜单中。
这方面的技术将根据您站点的设置而有所不同,具体来说,还取决于您希望支持多少“级别”的子菜单。但它可能看起来像这样:
global $wp_query;
$queried_object = $wp_query->get_queried_object();
$menu_query_args = array("meta_query" => array("key" => "_menu_item_object_id", "value" => $queried_object->ID));
$locations = get_nav_menu_locations();
$menu_objects = wp_get_nav_menu_items($locations["my_menu_area"], $menu_query_args);
if($menu_objects[0]->menu_item_parent == 0){ $submenu_id = $menu_objects[0]->ID; }
else{ $submenu_id = $menu_objects[0]->menu_item_parent; }
wp_nav_menu(array("theme_location" => "my_menu_area", "submenu" => $submenu_id));
我必须强调,这是一个非常简化的版本;你需要了解它是如何工作的,而不仅仅是把它放到你的网站上。您可能需要添加额外的逻辑,使其在您的站点上的行为完全符合您的需要。但希望这就是你需要开始的!