Uso de wp_get_nav_menu_items() para listar páginas hijas de hijas en WordPress

27 sept 2012, 21:42:40
Vistas: 15.6K
Votos: 5

Estoy trabajando con un tema basado en Genesis y me gustaría construir una estructura de menú de Página/Páginas hijas. Esa parte puedo hacerla con la ayuda de un código producido por Bill Erickson.

Básicamente lo que estoy intentando hacer es crear un menú encima del contenido en páginas que tienen páginas hijas. Luego, en la barra lateral izquierda, tener navegación para páginas hijas que a su vez tienen hijas. Tengo algo configurado aquí: sandbox.digisavvy.com

Aquí está el código con el que estoy trabajando:

<?php

/**
 * Menú de Sección
 * Muestra las subpáginas de la sección actual
 *
 * @author Bill Erickson
 * @link http://www.billerickson.net/custom-secondary-menu
 */
function be_section_menu() {

    // Solo ejecutar en páginas
    if( !is_page() )
        return;

    // Si es página de nivel superior, usar ID actual; de lo contrario usar ancestro más alto
    global $post;
    $section_id = empty( $post->ancestors ) ? $post->ID : end( $post->ancestors );

    // Obtener todas las ubicaciones de menú
    $locations = get_nav_menu_locations();
    // Encontrar qué menú está en la ubicación 'primary'
    $menu = wp_get_nav_menu_object( $locations[ 'primary' ] );
    // Obtener todos los ítems de menú en este menú que tengan como padre la sección actual.
    // Esto obtiene las subpáginas, asumiendo que la sección actual es una página de nivel superior
    $menu_items = wp_get_nav_menu_items( $menu->term_id, array( 'post_parent' => $section_id ) );
    // Si hay ítems de menú, construir el menú
    if( !empty( $menu_items ) ) {
        echo '<ul class="section-submenu">';
        $first = true;
        foreach( $menu_items as $menu_item ) {
            $classes = 'page-item';
            // Esto añade una clase al primer ítem para poder darle un estilo diferente
            if( $first )
                $classes .= ' first-menu-item';
            $first = false;
            // Esto marca el ítem de menú actual
            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' );

La siguiente parte que me gustaría lograr es crear un sistema de menú con Página Hija/Hija de Página Hija. Esa es la parte donde estoy atascado. Este código de abajo se sugiere como cambio, pero no hace exactamente lo que necesito. Solo añade los hijos de los hijos a la navegación.

global $post;
$level = count( $post->ancestors );
// Solo construir menú terciario si la página actual es al menos de tercer nivel
if( 1 > $level )
    return;
$section_id = $post->ancestors[$level - 2];
3
Comentarios

Hola Alex, por favor usa los botones WYSIWYG al escribir preguntas. Aún puedes editarla usando el enlace "editar" en la parte inferior izquierda de la pregunta.

kaiser kaiser
28 sept 2012 02:10:28

@kaiser gracias por instruirme. =) ¿Se ve mejor ahora el formato de mi pregunta? Obviamente, soy nuevo aquí, pero me gustaría contribuir haciendo las cosas "de la manera correcta".

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

¡Absolutamente sí! Gracias :) Realmente lo apreciamos cuando es fácil leer lo que la gente escribe.

kaiser kaiser
28 sept 2012 15:40:32
Todas las respuestas a la pregunta 2
0

Bueno, me temo que nunca logré resolver el código para esto. Lo que sí encontré es un par de plugins que logran lo que estoy buscando hacer. Listar subpáginas del mismo nivel que la subpágina/hija/nieta actual y luego poder excluir ciertas páginas para que no aparezcan.

Podría considerar combinar estos.

1 oct 2012 20:33:09
0

Acabo de escribir esto: https://gist.github.com/vwasteels/874f7d08726076bdc580

Recuperará los datos de forma recursiva y generará un array con los elementos hijos incrustados en cada item. Esto funcionará con menús de cualquier profundidad.

15 ene 2016 17:16:52