我尝试将导航分为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的第一个导航栏始终可见。仅当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;
}
在我的header.php中调用它:
<?php my_nav_menu( array( 'echo' => false , 'navlevel' => 1 ) ); ?>
但是$args
设置为默认值,并且我的自定义条目未navlevel
显示在过滤器中。
如何按照说明拆分导航栏?如何设置自定义$args
条目?
2
美好的一天,欢迎来到WPSE。我必须祝贺你第一次提出史诗般的构造性问题。清晰明确的结构良好的问题总是会吸引很多注意力,而且答案也很好。+1
—
Pieter Goosen 2014年
答案涉及定制的Walker课,也许这对任何潜在的答题者都有帮助
—
Tom J Nowell
谢谢。我只在这个周末才开始研究php / wp,所以我不是这个熟悉的人。我尝试了一个自定义的Walker,但是Walker一次只能处理一个项目,因此无法将其与当前项目进行比较。过滤器不接受我的自定义参数。嗯...
—
不动声色