Использование wp_get_nav_menu_items() для вывода списка дочерних страниц второго уровня

27 сент. 2012 г., 21:42:40
Просмотры: 15.6K
Голосов: 5

Я работаю с темой на основе Genesis и хочу создать структуру меню для страниц/дочерних страниц. Первую часть я смог реализовать с помощью кода от Билла Эриксона.

По сути, я пытаюсь создать меню над контентом для страниц, имеющих дочерние страницы. Затем, в левой боковой колонке, нужно вывести навигацию для дочерних страниц, которые сами имеют дочерние страницы. У меня есть черновик на sandbox.digisavvy.com.

Вот код, с которым я работаю:

<?php
/**
 * Меню раздела
 * Отображает подстраницы текущего раздела
 *
 * @author Bill Erickson
 * @link http://www.billerickson.net/custom-secondary-menu
 */
function be_section_menu() {

    // Работает только на страницах
    if( !is_page() )
        return;

    // Если это страница верхнего уровня, используем текущий ID, иначе используем ближайшего предка
    global $post;
    $section_id = empty( $post->ancestors ) ? $post->ID : end( $post->ancestors );

    // Получаем все расположения меню
    $locations = get_nav_menu_locations();
    // Определяем, какое меню находится в расположении 'primary'
    $menu = wp_get_nav_menu_object( $locations[ 'primary' ] );
    // Получаем все элементы меню, у которых родителем является текущий раздел
    // Это даст нам подстраницы, предполагая что текущий раздел - страница верхнего уровня
    $menu_items = wp_get_nav_menu_items( $menu->term_id, array( 'post_parent' => $section_id ) );
    // Если есть элементы меню, строим меню
    if( !empty( $menu_items ) ) {
        echo '<ul class="section-submenu">';
        $first = true;
        foreach( $menu_items as $menu_item ) {
            $classes = 'page-item';
            // Добавляем класс к первому элементу для особого стиля
            if( $first )
                $classes .= ' first-menu-item';
            $first = false;
            // Помечаем текущий элемент меню
            if( get_the_ID() == $menu_item->object_id )
                $classes .= ' current_page_item';
            echo '<li class="' . $classes . '"><a href="' . $menu_item->url . '">' . $menu_item->title . '</a></li>';
        }
        echo '</ul>';
    }
}
add_action( 'genesis_before_loop', 'be_section_menu' );

Следующая часть, которую я хочу реализовать - это создание меню с дочерними страницами второго уровня. Вот где я застрял. Этот код предлагается как решение, но он просто добавляет дочерние элементы второго уровня в навигацию, а не то, что нужно:

global $post;
$level = count( $post->ancestors );
// Строим третичное меню только если текущая страница как минимум третьего уровня
if( 1 > $level )
    return;
$section_id = $post->ancestors[$level - 2];
3
Комментарии

Привет, Алекс, пожалуйста, используй кнопки WYSIWYG при написании вопроса. Ты всё ещё можешь отредактировать его, используя ссылку "edit" внизу слева от вопроса.

kaiser kaiser
28 сент. 2012 г. 02:10:28

@kaiser спасибо, что объяснил. =) Теперь мой вопрос выглядит лучше? Очевидно, я здесь новичок, но хочу вносить вклад и делать всё "правильно".

Alex V. Alex V.
28 сент. 2012 г. 07:44:29

Определённо выглядит! Спасибо :) Мы действительно ценим, когда вопросы легко читаются.

kaiser kaiser
28 сент. 2012 г. 15:40:32
Все ответы на вопрос 2
0

Что ж, боюсь, мне так и не удалось разобраться с кодом для этого. Однако я нашел пару плагинов, которые делают то, что мне нужно: выводят список подстраниц того же уровня, что и текущая подстраница/дочерняя/внучатая страница, а также позволяют исключать определенные страницы из отображения.

Возможно, стоит попробовать объединить их функционал.

1 окт. 2012 г. 20:33:09
0

Я только что написал это: https://gist.github.com/vwasteels/874f7d08726076bdc580

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

15 янв. 2016 г. 17:16:52