问题描述
我尝试将导航分割成 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。