Использование wp_get_nav_menu_items() для вывода списка дочерних страниц второго уровня
Я работаю с темой на основе 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];
Что ж, боюсь, мне так и не удалось разобраться с кодом для этого. Однако я нашел пару плагинов, которые делают то, что мне нужно: выводят список подстраниц того же уровня, что и текущая подстраница/дочерняя/внучатая страница, а также позволяют исключать определенные страницы из отображения.
- http://wordpress.org/extend/plugins/child-page-navigation/
- http://wordpress.org/extend/plugins/exclude-pages/
Возможно, стоит попробовать объединить их функционал.

Я только что написал это: https://gist.github.com/vwasteels/874f7d08726076bdc580
Он будет рекурсивно получать данные и генерировать массив с дочерними элементами, вложенными в каждый родительский элемент. Это будет работать с меню любой глубины вложенности.
