Utilizarea wp_get_nav_menu_items() pentru a lista paginile copil ale copiilor în WordPress

27 sept. 2012, 21:42:40
Vizualizări: 15.6K
Voturi: 5

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];
3
Comentarii

Bună Alex, te rog să folosești butoanele WYSIWYG când scrii întrebări. Poți să o editezi ulterior, folosind linkul "edit" din colțul din stânga jos al întrebării.

kaiser kaiser
28 sept. 2012 02:10:28

@kaiser mulțumesc pentru îndrumare. =) Formatarea întrebării mele arată mai bine acum? Evident, sunt începător aici, dar aș dori să contribui și să fac lucrurile "cum trebuie".

Alex V. Alex V.
28 sept. 2012 07:44:29

Absolut! Mulțumesc :) Apreciem cu adevărat când textele oamenilor sunt ușor de citit.

kaiser kaiser
28 sept. 2012 15:40:32
Toate răspunsurile la întrebare 2
0

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ă.

Aș putea încerca să combin aceste soluții.

1 oct. 2012 20:33:09
0

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.

15 ian. 2016 17:16:52