Как ограничить только верхние уровни в wp_nav_menu?
Как можно установить ограничение только для пунктов верхнего уровня в меню wp_nav_menu
?
Пример:
У меня есть такое меню в админ-панели:
Я хочу подсчитать ТОЛЬКО пункты верхнего уровня и отображать ограниченное их количество, например, 5.
То есть, даже если в админ-панели сотни пунктов верхнего уровня, должно отображаться только 5.
Подпункты должны отображаться как обычно, без ограничений.
Я искал ответ здесь и в интернете и нашел это решение, но большая проблема в том, что оно учитывает и верхние уровни, и подпункты вместе, а мне нужно считать только верхние уровни.
Хотелось бы увидеть решение с использованием кастомного класса walker, если возможно, или на PHP в целом, а не с помощью трюков и хаков на CSS и jQuery.
Согласно кодексу, вам нужно использовать параметр depth
для отображения только страниц верхнего уровня:
<?php wp_nav_menu( array( 'location' => 'your_location', 'depth' => 1 ) ); ?>
Для более подробной информации см. эту ссылку.
Вы также можете решить обе проблемы, используя [wp_get_nav_menu_items][2]
и затем применяя пользовательский цикл для обработки только первых и верхнеуровневых страниц.
РЕДАКТИРОВАНО*** Я потратил некоторое время на начало решения, к сожалению, не могу закончить его прямо сейчас, и, возможно, можно сделать его более элегантным, но это может быть отправной точкой:
<?php
$menu_name = 'principal';
if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
$menu_test = wp_get_nav_menu_object( $locations[ $menu_name ] );
// ПОЛУЧАЕМ ЭЛЕМЕНТЫ В ПОРЯДКЕ МЕНЮ
$menu_test_items = wp_get_nav_menu_items( $menu_test->term_id );
$top_items = array();
// ПЕРЕБИРАЕМ ИХ И СОЗДАЕМ ВЛОЖЕННЫЙ МАССИВ, КАК В МЕНЮ
foreach( $menu_test_items as $menu_test_item ) {
if ( $menu_test_item->menu_item_parent == 0 ) {
$top_items[$menu_test_item->ID][$menu_test_item->ID] = $menu_test_item;
} else {
$top_items[$menu_test_item->menu_item_parent][$menu_test_item->ID] = $menu_test_item;
}
}
// ЗАТЕМ МЫ МОЖЕМ ПРОСТО ПЕРЕБИРАТЬ ЕГО X РАЗ И ПРЕРЫВАТЬ
foreach ( $top_items as $top_item ) {
// Теперь вам нужно перебрать x раз
// и отобразить $top_item с другим foreach
}
}
?>

Для справки, Sormano был на правильном пути, но фильтр передает строку. Правильная версия будет выглядеть так:
function my_max_5_menu_items( $menu_items) {
$menu_items = explode('</li>', $menu_items);
$menu_items = array_slice( $menu_items, 0, 5 );
return implode('</li>', $menu_items);
}
add_filter( "wp_nav_menu_items", "my_max_5_menu_items" );
Очевидно, что это работает только при использовании параметра depth=1
. Но это более простое решение по сравнению с созданием пользовательского walker, если вам нужно простое решение.
