问题描述

我尝试将导航分割成 3 个单一导航栏 (1 级,2 级和 3 级) 。三是因为它们在网站上分开,并且只能根据当前页面显示。

-0-------1--------2-------3+- level/depth
Home
 |
 |___ Lobby
 |
 |___ Projects
 |       |___ Project A
 |       |       |___ Review
 |       |       |___ Comments
 |       |       ____ Download
 |       ____ Project B
 |               |___ Review
 |               |___ Comments
 |               ____ Download
 |___ Blog
 |
 ____ About
         |___ Legal
         ____ Contact

包含级别 1 的第一个导航栏始终可见。第二个导航栏 (2 级) 只有当 im 当前在相应的父页面上。第三个导航栏 (3 级以上,加上因为此导航栏还将包含 3 级的子页面和子页面…) 也是如此。

简而言之:我想在他们的导航栏中显示所有的父菜单,只显示当前页面的直接子项。

我试过的

function my_nav_menu( $args = array() )
{
    $echo = isset( $args['echo'] ) ? (bool)( $args['echo'] ) : true;
    $args['echo'] = false;

    add_filter( 'wp_get_nav_menu_items' , 'my_nav_menu_filter' , 666 , 3 );

    $menu = wp_nav_menu( $args );

    remove_filter( 'wp_nav_menu_objects' , 'my_nav_menu_filter' , 666 );

    if( $echo )
        echo $menu;
    else
        return $menu;
}

function my_nav_menu_filter( $items , $menu , $args )
{
    //var_dump( $args );

    $navLevel = isset( $args['navlevel'] ) ? (int)( $args['navlevel'] ) : 0;

    //echo 'navlevel = ' . $args['navlevel'] . ' | ' . $navLevel;

    if( $navLevel == 1 )
    {
        foreach( $items as $key => $item )
        {
            if( $item->menu_item_parent != 0 )
                unset( $items[$key] );
        }
    }
    else if( $navLevel == 2 )
    {
        foreach( $items as $key => $item )
        {
            if( $item->menu_item_parent != 0 )
            {
                $page = get_page( $item->menu_item_parent );

                if( $page->menu_item_parent == 0 )
                    continue;
            }

            unset( $items[$key] );
        }
    }
    else if( $navLevel == 3 )
    {
        foreach( $items as $key => $item )
        {
            if( $item->menu_item_parent != 0 )
            {
                $page = get_page( $item->menu_item_parent );

                if( $page->menu_item_parent != 0 )
                    continue;
            }

            unset( $items[$key] );
        }
    }
    else
    {
        //var_dump( $items );
    }

    return $items;
}

在我的 header.php 中调用它:<?php my_nav_menu( array( 'echo' => false , 'navlevel' => 1 ) ); ?>

但是,$args 设置为默认值,我的自定义条目 navlevel 不会显示在过滤器中。

如何按照描述分割导航栏?如何设置自定义 $args -entry?

最佳解决方案

我想我得到了答案:

function my_nav_menu( $args = array() )
{
    $echo = isset( $args['echo'] ) ? (bool)( $args['echo'] ) : true;

    $args['echo'] = false;

    add_filter( 'wp_nav_menu_objects' , 'my_filter_nav_menu' , 100 , 2 );

    $menu = wp_nav_menu( $args );

    remove_filter( 'wp_nav_menu_objects' , 'my_filter_nav_menu' , 100, 2 );

    if( $echo )
        echo $menu;
    else
        return $menu;
}

这是一个诀窍:让我改变 menuitems 和自定义 args 仍然可用。我不小心把过滤器连接到 wp_get_nav_menu_items 而不是 wp_nav_menu_objects 。我仍然有过滤问题,但这些可能是一些逻辑错误。

编辑:我将通过将导航栏 2 级和导航栏级别 3+组合成一个并将其与 css 分离来解决我的问题

继承目前的 php 部分:

function serthy_filter_nav_menu( $items , $args )
{
    $argArray = (array)( $args );

    if( isset( $argArray['toplevel'] ) )
    {
        foreach( $items as $key => $item )
        {
            if( $item->menu_item_parent != 0 )
                unset( $items[$key] );
        }

        return $items;
    }

    global $post;

    $arr = array();

    foreach( $items as $key => $item )
    {
        $parentIDs = get_post_ancestors( $item->ID );

        foreach( $parentIDs as $i => $parentID )
        {
            if( $parentID == $post->ID )
            {
                array_push( $arr , $item );

                break;
            }
        }
    }

    return $arr;
}

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。