Как ограничить только верхние уровни в wp_nav_menu?

3 апр. 2013 г., 12:23:32
Просмотры: 16.7K
Голосов: 4

Как можно установить ограничение только для пунктов верхнего уровня в меню wp_nav_menu?

Пример:

У меня есть такое меню в админ-панели:

Пример меню

Я хочу подсчитать ТОЛЬКО пункты верхнего уровня и отображать ограниченное их количество, например, 5.

То есть, даже если в админ-панели сотни пунктов верхнего уровня, должно отображаться только 5.

Подпункты должны отображаться как обычно, без ограничений.

Я искал ответ здесь и в интернете и нашел это решение, но большая проблема в том, что оно учитывает и верхние уровни, и подпункты вместе, а мне нужно считать только верхние уровни.

Хотелось бы увидеть решение с использованием кастомного класса walker, если возможно, или на PHP в целом, а не с помощью трюков и хаков на CSS и jQuery.

0
Все ответы на вопрос 3
1

Согласно кодексу, вам нужно использовать параметр 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
        }
    }
?>
3 апр. 2013 г. 13:30:39
Комментарии

спасибо, Саймон, ты прав насчет глубины и wp_get_nav_menu_items, но что я хочу достичь - это показывать как верхние, так и подуровневые страницы, с ограниченным количеством верхних страниц.

user30910 user30910
3 апр. 2013 г. 23:44:19
0

вы можете попробовать что-то вроде:

function my_max_5_menu_items( $menu_items) {

    return array_slice( $menu_items, 0, 5 );

}
add_filter( "wp_nav_menu_items", "my_max_5_menu_items" );

Не было возможности протестировать это.

9 мар. 2014 г. 15:55:32
0

Для справки, 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, если вам нужно простое решение.

18 февр. 2016 г. 20:25:45