問題描述
我嘗試將導航分割成 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。