为了账号安全,请及时绑定邮箱和手机立即绑定

Wordpress 中的当前级别导航

Wordpress 中的当前级别导航

PHP
qq_遁去的一_1 2021-11-26 16:07:16
我有一个 3 级导航:Home   > submenu1       >> sub3          > submenu       >> sub4              >> sub5       // current pageAbout   > about2       >> sub6          > about3       >> sub7       我试图分别获得每个导航级别,使用上面的示例导航,在 sub5 页面上,我需要当前第一级导航:首页当前并行的第二级导航:submenu1、submenu(都在 Home 下)当前并行的第 3 级导航: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 级导航。谢谢。
查看完整描述

1 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

编辑:


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


// 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>';


}

我试图将其写成自我解释,但如果您有任何问题,我将很乐意提供帮助。


查看完整回答
反对 回复 2021-11-26
  • 1 回答
  • 0 关注
  • 167 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信