Я пытаюсь разделить навигацию на 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) только тогда, когда я нахожусь на соответствующей родительской странице. То же самое относится и к третьей панели навигации (уровень 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
ввод?
источник
Ответы:
Я думаю, что я получил ответ:
Это делает свое дело: позволяет мне изменять пункты меню, и пользовательские аргументы все еще доступны. Я случайно подключил фильтр
wp_get_nav_menu_items
вместоwp_nav_menu_objects
. У меня все еще есть проблемы с фильтрацией, однако это, вероятно, некоторые логические ошибки ..РЕДАКТИРОВАТЬ: я решил свою проблему, объединив уровень 2 Navbar и уровень 3+ Navbar в один и разделив их с помощью CSS
Вот текущая часть PHP:
источник
$echo = ! isset( $args['echo'] ) ?: $args['echo'];
Мне кажется, что вы могли бы справиться с этим с помощью CSS, поскольку вы можете скрыть опции меню нижнего уровня по умолчанию, а затем выбрать их показ, если у них есть определенные классы над ними.
На этой странице Кодекса вы можете увидеть классы меню (и на самой странице). Таким образом, для «второго уровня», который вы описали, предполагается, что меню первого уровня - это уровень 1, а не 0.
А потом что-то похожее для следующего уровня вниз:
Очевидно, замените «block» на «inline-block» или на то, на что обычно настроено ваше меню.
Возможно, вам придется поиграть, чтобы найти правильную комбинацию классов, но мне уже повезло с этим методом. WP бросает кучу уроков там, может с тем же успехом их использовать.
источник