我尝试将导航拆分为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
-进入
最合适的回答,由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在那里放置了大量的类,也可以使用它们。