如何在页面上显示基于引用顶层父级的子菜单?

时间:2016-05-03 作者:CBlanch

我试图在页面上显示一个二级菜单,该菜单显示它们从中导航到那里的顶级菜单项的所有协调子页面,但我的问题是,一些页面显示在多个顶级菜单项下。既然我知道我不能将一个页面分配给多个父级,那么有没有办法通过自定义字段或分类法来实现这一点?还是有更好的方法?

我可能不是在用最好的方式解释这一点,但你可以看到一个例子,说明我正在努力实现的目标http://parkered.org. 如果导航到优势>关键行业,您将看到整个优势子菜单是如何显示在顶部的。但是,“关键行业”页面也存在于“业务服务”菜单项下,因此如果从那里单击该页面,则“业务服务”子菜单将显示在顶部。

1 个回复
最合适的回答,由SO网友:Tim Malone 整理而成

在您的示例中,“关键行业”页面在每个顶级菜单下都是不同的页面,或者至少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));
    
    我必须强调,这是一个非常简化的版本;你需要了解它是如何工作的,而不仅仅是把它放到你的网站上。您可能需要添加额外的逻辑,使其在您的站点上的行为完全符合您的需要。但希望这就是你需要开始的!

相关推荐

无法将设置添加到“NAV_MENUS”定制器面板

我试图在自定义程序的“菜单”面板中添加一个复选框,但由于某些原因,它没有显示出来。如果我尝试将其从“nav\\u菜单”更改为“title\\u tagline”或“colors”,复选框会显示得很好。是什么阻止它显示在“菜单”面板上?// add custom options to the Customizer function nssra_customizer_options($wp_customize) { // add \"menu primary flex\" checkb