Utilizarea wp_get_nav_menu_items() pentru a lista paginile copil ale copiilor în WordPress
Lucrez cu o Temă Bazată pe Genesis și aș dori să construiesc o structură de meniu pentru Pagini/Pagini Copil. Această parte o pot face cu ajutorul unui cod produs de Bill Erickson.
În esență, încerc să creez un meniu deasupra conținutului pe paginile care au pagini copil. Apoi, în bara laterală stângă, să am navigare pentru paginile copil care au la rândul lor copii. Am ceva configurat aici: sandbox.digisavvy.com
Iată codul cu care lucrez.
<?php
/**
* Meniul Secțiunii
* Afișează subpaginile secțiunii curente
*
* @author Bill Erickson
* @link http://www.billerickson.net/custom-secondary-menu
*/
function be_section_menu() {
// Rulează doar pe pagini
if( !is_page() )
return;
// Dacă e pagină de nivel superior, folosește ID-ul curent; altfel folosește strămoșul cel mai înalt
global $post;
$section_id = empty( $post->ancestors ) ? $post->ID : end( $post->ancestors );
// Obține toate locațiile de meniu
$locations = get_nav_menu_locations();
// Găsește care meniu este în locația 'primary'
$menu = wp_get_nav_menu_object( $locations[ 'primary' ] );
// Ia toate elementele de meniu din acest meniu care au ca părinte secțiunea curentă.
// Acesta ia subpaginile, presupunând că secțiunea curentă este o pagină de nivel superior
$menu_items = wp_get_nav_menu_items( $menu->term_id, array( 'post_parent' => $section_id ) );
// Dacă există elemente de meniu, construiește meniul
if( !empty( $menu_items ) ) {
echo '<ul class="section-submenu">';
$first = true;
foreach( $menu_items as $menu_item ) {
$classes = 'page-item';
// Aceasta adaugă o clasă primului element pentru a-l stiliza diferit
if( $first )
$classes .= ' first-menu-item';
$first = false;
// Aceasta marchează elementul de meniu curent
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' );
Următoarea parte pe care aș dori să o realizez este să creez un sistem de meniu cu Pagini Copil/Copii ai Paginilor Copil. Aceasta este partea la care sunt blocat. Acest cod de mai jos este sugerat ca o modificare, dar nu funcționează chiar așa cum trebuie. Doar adaugă copiii copiilor la navigare.
global $post;
$level = count( $post->ancestors );
// Construiește meniul terțiar doar dacă pagina curentă este de cel puțin nivelul trei
if( 1 > $level )
return;
$section_id = $post->ancestors[$level - 2];
Ei bine, se pare că nu am reușit niciodată să rezolv codul pentru asta. Ce am găsit însă este o pereche de plugin-uri care fac exact ceea ce caut. Afișează subpagini de același nivel cu pagina curentă (copil sau nepot) și permit excluderea anumitor pagini din listă.
- http://wordpress.org/extend/plugins/child-page-navigation/
- http://wordpress.org/extend/plugins/exclude-pages/
Aș putea încerca să combin aceste soluții.

Tocmai am scris acest cod: https://gist.github.com/vwasteels/874f7d08726076bdc580
Acesta va prelua recursiv și va genera un array cu elementele copil încorporate în fiecare item. Funcționează pentru meniuri de orice adâncime.
