Php Wordpress中的当前级别导航

Php Wordpress中的当前级别导航,php,wordpress,wp-nav-walker,wp-nav-menu-item,Php,Wordpress,Wp Nav Walker,Wp Nav Menu Item,我有一个三级导航: Home > submenu1 >> sub3 > submenu >> sub4 >> sub5 // current page About > about2 >> sub6 > about3 >> sub7 我试图分别获取每个导

我有一个三级导航:

Home
   > submenu1
       >> sub3       
   > submenu
       >> sub4       
       >> sub5       // current page
About
   > about2
       >> sub6       
   > about3
       >> sub7       
我试图分别获取每个导航级别

对于上面的示例nav,在sub5页面上,我需要

当前一级导航:主页

当前平行二级导航:子菜单1,子菜单(谁都在主菜单下)

当前平行三级导航:sub4、sub5(谁是子菜单下的菜单)

我需要修改菜单的元素和样式,并需要使用php中的菜单项,例如:

$menu_name = 'topnav';
if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
$menu = wp_get_nav_menu_object( $locations[ $menu_name ] );
$menu_items = wp_get_nav_menu_items($menu->term_id);

foreach ( (array) $menu_items as $key => $menu_item ) {
    $title = $menu_item->title;
    $url = $menu_item->url;
    [...]
请帮助分别显示导航层,如上所述

我让1级和3级工作,但无法使当前的平行2级导航正确显示

谢谢

当前代码:第二导航工程:

<?php
$menu_name = 'topnav';
if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {

    $menu = wp_get_nav_menu_object( $locations[ $menu_name ] );

    $menu_items = wp_get_nav_menu_items( $menu->term_id );

    // Convert Objects to Arrays, Enables us to use Array Filter
    $json  = json_encode($menu_items);
    $menu_items = json_decode($json, true);

    // Current Page
    $child = get_the_id();


    $current_level = array_filter( $menu_items, function($v, $k) use ($child) {
    return $v['object_id'] == $child;
    }, ARRAY_FILTER_USE_BOTH );

    $current_level_keys = array_keys($current_level);
    $parent = $current_level[$current_level_keys[0]]['menu_item_parent'];

    if( !empty( $parent ) )
    {
    $current_level_items = array_filter( $menu_items, function($v, $k) use ($parent)  {
        return $v['menu_item_parent'] == $parent;
    }, ARRAY_FILTER_USE_BOTH );
    } else {
    $current_level_items = $current_level[$current_level_keys[0]];
    }

    //echo '1:';
    //echo '<pre>';
    //print_r($current_level_items);
    //echo '</pre>';

    //foreach ($current_level_items as $k => $v) {
    //  echo '<li><a href="#">'.$v['title'].'</a></li>';
    //}

    $parent_level = array_filter( $menu_items, function($v, $k) use ($parent) {
    return $v['ID'] == $parent;
    }, ARRAY_FILTER_USE_BOTH );

    $parent_level_keys = array_keys($parent_level);
    $grand_parent = $parent_level[$parent_level_keys[0]]['menu_item_parent'];

    if( !empty( $grand_parent ) )
    {
    $parent_level_items = array_filter( $menu_items, function($v, $k) use ($grand_parent)  {
        return $v['menu_item_parent'] == $grand_parent;
    }, ARRAY_FILTER_USE_BOTH );
    } else {
    $parent_level_items = $parent_level[$parent_level_keys[0]];
    }

    //echo '2:';
    //echo '<pre>';
    //print_r($parent_level_items);
    //echo '</pre>';
    //foreach ($parent_level_items as $k => $v) {
    //echo '<li><a href="#">'.$v['title'].'</a></li>';
    //}

    $grand_parent_level = array_filter( $menu_items, function($v, $k) use ($grand_parent) {
    return $v['ID'] == $grand_parent;
    }, ARRAY_FILTER_USE_BOTH );

    $grand_parent_level_keys = array_keys($grand_parent_level);
    $great_grand_parent = $grand_parent_level[$grand_parent_level_keys[0]];

    if( !empty( $parent ) ) {
        if( !empty( $great_grand_parent ) ) {
        echo '<li class="custom-page-title">'.$great_grand_parent['title'].'</li>';
        if (is_array($parent_level_items)) {
            foreach ($parent_level_items as $k => $v) {
                echo '<li><a href="'.$v['url'].'">'.$v['title'].'</a></li>';
            }
        }
        } else {
        echo '<li class="custom-page-title">'.$parent_level_items['title'].'</li>';
        if (is_array($current_level_items)) {
            foreach ($current_level_items as $k => $v) {
                echo '<li><a href="'.$v['url'].'">'.$v['title'].'</a></li>';
            }
        }
        }
    }
    //echo '3:';
    //echo '<pre>';
    //print_r($great_grand_parent);
    //echo '</pre>';

}
?>
当访问重复页面(sub5)时,返回的父页面是第一个页面(主页>子菜单),而它应该是(关于>关于3)


请帮助修复此问题…

编辑:

要解决重复的情况,您必须添加一行代码。可以根据要选择的父链添加以下行之一。我还在实际代码中添加这些行,以向您显示它们的位置

原始答案:(也用上述行更新)

此代码将为您提供所有级别的项目,它根据您的需求仅为三个级别编写,但您可以使用逻辑并根据需要将代码重复到任意多个级别,或者更好地编写一些递归的内容

$menu_name='topnav';
if($locations=get_nav_menu_locations())和&isset($locations[$menu_name])){
$menu=wp_get_nav_menu_object($locations[$menu_name]);
$menu\u items=wp\u get\u nav\u menu\u menu\u items($menu->term\u id);
//将对象转换为数组,使我们能够使用数组过滤器
$json=json_编码($menu_项);
$menu\u items=json\u decode($json,true);
//当前页
$child=获取_id();
$current\u level=array\u filter($menu\u项,函数($v,$k)use($child){
返回$v['object_id']==$child;
},数组\过滤器\使用\两者);
//获取第一个父链(如果要使用此项,请取消第行下方的注释)
//$current_level=数组_值(数组_切片($current_level,0,1));
//获取最后一个父链(如果要使用此项,请取消第行下方的注释)
//$current_level=数组_值(数组_切片($current_level,-1,1));
$current_level_keys=数组_keys($current_level);
$parent=$current_level[$current_level_keys[0]['菜单项_parent'];
如果(!空($parent))
{
$current\u level\u items=array\u filter($menu\u items,function($v,$k)use($parent){
返回$v['menu\u item\u parent']==$parent;
},数组\过滤器\使用\两者);
}否则{
$current_level_items=$current_level[$current_level_keys[0]];
}
回声';
打印(当前级项目);
回声';
$parent\u level=array\u filter($menu\u项,函数($v,$k)use($parent){
返回$v['ID']==$parent;
},数组\过滤器\使用\两者);
$parent_level_keys=数组_keys($parent_level);
$grand_parent=$parent_level[$parent_level_keys[0]['menu_item_parent'];
如果(!空($grand_parent))
{
$parent\u level\u items=array\u filter($menu\u items,function($v,$k)use($grand\u parent){
返回$v['menu\u item\u parent']==$grand\u parent;
},数组\过滤器\使用\两者);
}否则{
$parent_level_items=$parent_level[$parent_level_keys[0]];
}
回声';
打印(父级项目);
回声';
$grand\u parent\u level=数组过滤器($menu\u项,函数($v,$k)使用($grand\u parent){
返回$v['ID']=$grand\u parent;
},数组\过滤器\使用\两者);
$grand_parent_level_keys=数组_keys($grand_parent_level);
$great_grand_parent=$grand_parent_level[$grand_parent_level_keys[0]];
回声';
印刷品($great\u grand\u parent);
回声';
}

我试着写得一目了然,但如果您有任何问题,我会很乐意帮助您。

您能分享一下您用于获得第一和第三等级的代码吗?您能直观地解释一下您正在谈论的案例吗?就像你在文章开头所做的那样。只是根据要求添加了一个视觉效果。它不会像这样工作。你不应该有重复项,如果你真的需要重复项,那么你必须选择第一个或最后一个父链。处理这个问题的最好方法是根本没有重复项。因为你要做的事情是不允许重复的。请考虑一下,两条链对一个项目都有效。如何选择一个路径,并且不应设置多个路径的样式。系统不知道您正在通过哪条路径,除非我们查看参考者,这将成为一个很长的故事。如果我在nav中处于第三级,则代码有效,但如果当前页面处于第二级,则代码无效。。。你能修改你的代码,使菜单项在所有级别都能工作吗?例如,如果我在“子菜单”(第二级)下,第一级导航应该是“主页”,第二级导航应该是“子菜单1,子菜单”,第三级导航应该是“sub4,sub5”,如果有两个菜单项链接到同一页面,父项不正确…@LucLaverdure该代码适用于所有级别。然而,重复的东西不是我测试过的东西。你能再解释一点吗,比如你问题中的用例?
Home
   > submenu1
       >> sub3
   > submenu
       >> sub4       
       >> sub5       // current page
About
   > about2
       >> sub6       
   > about3
       >> sub7
       >> sub5       // duplicate page
// Get First Parent Chain
$current_level = array_values(array_slice($current_level, 0, 1));

// Get Last Parent Chain
$current_level = array_values(array_slice($current_level, -1, 1));
$menu_name = 'topnav';
if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {

    $menu = wp_get_nav_menu_object( $locations[ $menu_name ] );

    $menu_items = wp_get_nav_menu_items( $menu->term_id );

    // Convert Objects to Arrays, Enables us to use Array Filter
    $json  = json_encode($menu_items);
    $menu_items = json_decode($json, true);

    // Current Page
    $child = get_the_id();


    $current_level = array_filter( $menu_items, function($v, $k) use ($child) {
        return $v['object_id'] == $child;
    }, ARRAY_FILTER_USE_BOTH );

    // Get First Parent Chain ( Uncomment below line if you want to use this )
    //$current_level = array_values(array_slice($current_level, 0, 1));

    // Get Last Parent Chain ( Uncomment below line if you want to use this )
    //$current_level = array_values(array_slice($current_level, -1, 1));


    $current_level_keys = array_keys($current_level);
    $parent = $current_level[$current_level_keys[0]]['menu_item_parent'];

    if( !empty( $parent ) )
    {
        $current_level_items = array_filter( $menu_items, function($v, $k) use ($parent)  {
            return $v['menu_item_parent'] == $parent;
        }, ARRAY_FILTER_USE_BOTH );
    } else {
        $current_level_items = $current_level[$current_level_keys[0]];
    }

    echo '<pre>';
    print_r($current_level_items);
    echo '</pre>';

    $parent_level = array_filter( $menu_items, function($v, $k) use ($parent) {
        return $v['ID'] == $parent;
    }, ARRAY_FILTER_USE_BOTH );

    $parent_level_keys = array_keys($parent_level);
    $grand_parent = $parent_level[$parent_level_keys[0]]['menu_item_parent'];

    if( !empty( $grand_parent ) )
    {
        $parent_level_items = array_filter( $menu_items, function($v, $k) use ($grand_parent)  {
            return $v['menu_item_parent'] == $grand_parent;
        }, ARRAY_FILTER_USE_BOTH );
    } else {
        $parent_level_items = $parent_level[$parent_level_keys[0]];
    }

    echo '<pre>';
    print_r($parent_level_items);
    echo '</pre>';

    $grand_parent_level = array_filter( $menu_items, function($v, $k) use ($grand_parent) {
        return $v['ID'] == $grand_parent;
    }, ARRAY_FILTER_USE_BOTH );

    $grand_parent_level_keys = array_keys($grand_parent_level);
    $great_grand_parent = $grand_parent_level[$grand_parent_level_keys[0]];

    echo '<pre>';
    print_r($great_grand_parent);
    echo '</pre>';

}