Как исключить подуровневые пункты меню в wp_get_nav_menu_items?

27 янв. 2012 г., 18:44:58
Просмотры: 15K
Голосов: 4

У меня есть следующая функция для вывода пользовательского меню в формате select для адаптивного дизайна, над которым я работаю.

Она работает именно так, как я хочу, за исключением того, что мне нужно исключить подпункты меню. Сейчас она включает все уровни.

Кто-нибудь знает, как я могу указать wp_get_nav_menu_items выводить только пункты верхнего уровня меню?

function jeMobileMenu( $args ) {

        // Установка аргументов по умолчанию
        $defaults = array (
            'menuSlug'      =>  '',
            'placeholder'   =>  'Меню',
            'prefix'        =>  ' » ',
            'navID'         =>  'mobileNav',
            'navClass'      =>  ''
        );

        // Объединение входящих $args с $defaults
        $args = wp_parse_args( $args, $defaults );

        // Извлечение каждого элемента $args в отдельную переменную
        extract( $args, EXTR_SKIP );

        // Если slug меню не передан, выходим
        if ( empty($menuSlug) )
            return;

        // Если переданный slug меню не существует, выходим
        if ( !has_nav_menu( $menuSlug ) )
            return;

        $locations = get_nav_menu_locations();
        $menu = wp_get_nav_menu_object( $locations[ $menuSlug ] );

        $menu_items = wp_get_nav_menu_items($menu->term_id);

        // Обертка select в nav элемент с переданными id и классами
        $menu_output = '<nav id="' . $navID . '" class="' . $navClass . '">';

        $menu_output .= '<select id="menu-' . $menuSlug . '" onchange="window.open(this.options[this.selectedIndex].value,\'_top\')">';

        // Добавление плейсхолдера и ссылки на главную
        $menu_output .= '<option value="">' . $placeholder . '</option>';
        $menu_output .= '<option value="' . home_url( '/' ) . '">' . $prefix . 'Главная</option>';

        // Цикл по всем пунктам меню и создание option элементов        
        foreach ( (array) $menu_items as $key => $menu_item ) {
            $title = $menu_item->title;
            $url = $menu_item->url;
            $menu_output .= '<option value="' . $url . '">' . $prefix . $title . '</option>';
        }
        $menu_output .= '</select>';

        $menu_output .= '</nav>';

        echo $menu_output;
    }
0
Все ответы на вопрос 1
2

Кажется, я разобрался!

Я сделал print_r для каждого $menu_item и увидел, что там есть ключ массива под названием menu_item_parent.

Поэтому я изменил это:

foreach ( (array) $menu_items as $key => $menu_item ) {
    $title = $menu_item->title;
    $url = $menu_item->url;
    $menu_output .= '<option value="' . $url . '">' . $prefix . $title . '</option>';
}

на это:

foreach ( (array) $menu_items as $key => $menu_item ) {
    if ( $menu_item->menu_item_parent == 0 ) :
        $title = $menu_item->title;
        $url = $menu_item->url;
        $menu_output .= '<option value="' . $url . '">' . $prefix . $title . '</option>';
    endif;
}

Теперь будут выбираться только пункты меню, у которых нет родительского элемента.

27 янв. 2012 г. 19:06:35
Комментарии

Если это решение, отметьте его как принятое.

mor7ifer mor7ifer
27 янв. 2012 г. 19:13:48

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

Brigante Brigante
27 янв. 2012 г. 19:35:04