Saya mencoba untuk membagi navigasi saya menjadi 3 bar navigasi tunggal (level 1, level 2 dan level3 +). Tiga karena mereka dipisahkan oleh situs dan seharusnya hanya muncul tergantung pada halaman saat ini.
-0-------1--------2-------3+- level/depth
Home
|
|\___ Lobby
|
|\___ Projects
| |\___ Project A
| | |\___ Review
| | |\___ Comments
| | \____ Download
| \____ Project B
| |\___ Review
| |\___ Comments
| \____ Download
|\___ Blog
|
\____ About
|\___ Legal
\____ Contact
Navbar pertama yang berisi level 1 selalu terlihat. Navbar kedua (level 2) hanya ketika saya saat ini pada halaman induk yang sesuai. Hal yang sama berlaku untuk navbar ketiga (level 3+, plus karena navbar ini juga akan berisi sub halaman dan sububuh halaman ... dari level 3).
Singkatnya: Saya ingin menampilkan semua menu induk di navbars mereka dan hanya anak-anak langsung dari halaman saat ini.
Apa yang saya coba:
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;
}
Memanggil ini di header.php saya:
<?php my_nav_menu( array( 'echo' => false , 'navlevel' => 1 ) ); ?>
Namun $args
diatur ke nilai default dan entri kustom saya navlevel
tidak ditampilkan di filter.
Bagaimana saya bisa membagi navbar saya seperti yang dijelaskan? Bagaimana cara saya mengatur kustom-masuk saya $args
?
sumber
Jawaban:
Saya pikir saya mendapat jawabannya:
Ini caranya: izinkan saya mengubah menu dan argumen khusus masih tersedia. Saya tidak sengaja menghubungkan filter ke
wp_get_nav_menu_items
bukanwp_nav_menu_objects
. Saya masih mengalami masalah dengan penyaringan, namun ini mungkin beberapa bug logis ..EDIT: saya akan menyelesaikan masalah saya dengan menggabungkan navbar level 2 dan navbar level 3+ menjadi satu dan memisahkannya dengan css
inilah bagian php saat ini:
sumber
$echo = ! isset( $args['echo'] ) ?: $args['echo'];
Menurut saya, Anda dapat menangani ini melalui CSS karena Anda dapat menyembunyikan opsi menu tingkat bawah secara default, dan kemudian memilih untuk memperlihatkannya jika mereka memiliki kelas tertentu di atasnya.
Pada halaman Codex ini , Anda dapat melihat kelas menu (dan pada halaman Anda sendiri). Jadi untuk "tingkat kedua" yang Anda jelaskan, dengan asumsi menu tingkat pertama adalah tingkat 1 - bukan 0.
Dan kemudian sesuatu yang serupa untuk level berikutnya turun:
Jelas ganti "blokir" dengan "blok-inline" atau apa pun menu yang biasanya diatur untuk Anda.
Anda mungkin perlu bermain-main untuk menemukan kombinasi kelas yang tepat, tetapi saya sudah beruntung dengan metode ini sebelumnya. WP menjatuhkan satu ton kelas di sana, mungkin juga menggunakannya.
sumber