Filter wp_nav_menu()

时间:2014-04-07 作者:nonsensation

我尝试将导航拆分为3个单独的导航栏(level 1、level 2和level 3+)。三个,因为它们在站点上是分开的,它们只应根据当前页面显示。

-0-------1--------2-------3+- level/depth
Home
 |
 |\\___ Lobby
 |
 |\\___ Projects
 |       |\\___ Project A
 |       |       |\\___ Review
 |       |       |\\___ Comments
 |       |       \\____ Download
 |       \\____ Project B
 |               |\\___ Review
 |               |\\___ Comments
 |               \\____ Download
 |\\___ Blog
 |
 \\____ About
         |\\___ Legal
         \\____ Contact
包含level 1的第一个导航栏始终可见。仅当im当前位于相应的父页面上时,才显示第二个导航栏(级别2)。第三个导航栏也是如此(级别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;
}
在我的标题中调用此。php:<?php my_nav_menu( array( \'echo\' => false , \'navlevel\' => 1 ) ); ?>

然而$args 设置为默认值和我的自定义条目navlevel 过滤器中未显示。

如何按描述拆分导航栏?如何设置自定义$args-进入

2 个回复
最合适的回答,由SO网友:nonsensation 整理而成

我想我得到了答案:

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;
}
这样做的诀窍是:让我更改菜单项,自定义参数仍然可用。我不小心把过滤器钩住了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;
}

SO网友:Amanda Giles

在我看来,你可以通过CSS处理这个问题hide 默认情况下,选择较低级别菜单选项,然后选择show 如果他们有比他们更高的等级。

在…上this Codex page, 您可以看到菜单类(以及页面本身)。因此,对于;“第二级”;如前所述,假设第一级菜单为level 1-而不是0。

ul > li > ul.sub-menu { display: none; }  /* Hide by default */
ul > li.current-menu-parent > ul.sub-menu { display: block; } /* Show menu */
然后是下一个级别的类似内容:

ul > li > ul.sub-menu > li > ul.sub-menu{ display: none; }  /* Hide by default */
ul > li > ul.sub-menu > li.current-menu-parent > ul.sub-menu { display: block; }
明显地替换;“块”;带“,”;“内联块”;或者菜单通常设置为的任何内容。

你可能需要四处玩转才能找到正确的类组合,但我以前很幸运使用过这种方法。WP在那里放置了大量的类,也可以使用它们。

结束

相关推荐

Slider's missing navigation

我安装了BuddyPress和Easy FancyBox,还安装了carouFredSel滑块(不是WordPress插件)。启用这两个插件后,滑块将停止正常工作(导航项目符号丢失)。这可能是某种jQuery冲突吗?这是标题。php:http://pastebin.com/eBLpFBZ9 下面是带有滑块的页面:http://adamklimowski.pl/chamois/提前感谢您提供的任何帮助。