Agregar páginas hijas automáticamente al menú de navegación

27 may 2013, 08:17:06
Vistas: 13.9K
Votos: 5

He construido un menú personalizado en WordPress que contiene enlaces a publicaciones y páginas. Lo estoy agregando a mi encabezado usando esta línea de código:

<?php 

wp_nav_menu(
    array(
        'theme_location' => 'primary', 
        'depth'          => 0, 
        'menu_class'     => 'nav-menu',
    ) 
);

?>

Mi problema es que si agrego una página hija a las páginas principales del menú, no aparecen automáticamente como subenlaces en la navegación. Sé que puedo crearlas manualmente cada vez reconstruyendo el menú, pero me gustaría poder simplemente agregar una página hija en la sección de páginas y que aparezca en la navegación sin tener que ir al menú y construirlo allí también, ¿tiene sentido?

He intentado usar depth => 0, pero no funcionó. ¿Hay alguna manera de que las páginas hijas aparezcan sin tener que construirlo en el menú personalizado?

4
Comentarios

La única forma que conozco es cuando tu menú personalizado está vacío, WordPress lo llenará con todas las páginas existentes. Una vez que comiences a agregar páginas dentro de él, no continuará automáticamente.

Alexandre Lavoie Alexandre Lavoie
27 may 2013 08:22:24

Parece que tienes un problema con la configuración de un componente de software. Por favor, contacta al vendedor de ese componente para conocer tus opciones de soporte, este sitio web trata sobre preguntas concretas de programación, no sobre cómo usar una API específica de un vendedor.

hakre hakre
27 may 2013 09:40:29

Gracias por migrar Toscho - no sabía que existía este foro.

Desmond Desmond
28 may 2013 03:59:20

código para menú con submenú de páginas y páginas hijas. PUEDE ayudarte a construir tu menú a partir de páginas hijas y páginas hijas de manera pragmática.

Core Core
28 may 2013 09:37:49
Todas las respuestas a la pregunta 1
6
14

aquí está cómo:

/**
* auto_child_page_menu
* 
* clase para agregar dinámicamente elementos de menú de páginas secundarias al menú de página principal
* @author Ohad Raz <admin@bainternet.info>
*/
class auto_child_page_menu
{
    /**
     * constructor de la clase
     * @author Ohad Raz <admin@bainternet.info>
     * @param   array $args 
     * @return  void
     */
    function __construct($args = array()){
        add_filter('wp_nav_menu_objects',array($this,'on_the_fly'));
    }
    /**
     * la función mágica que agrega las páginas secundarias
     * @author Ohad Raz <admin@bainternet.info>
     * @param  array $items 
     * @return array 
     */
    function on_the_fly($items) {
        global $post;
        $tmp = array();
        foreach ($items as $key => $i) {
            $tmp[] = $i;
            //si no es una página, continuar
            if ($i->object != 'page'){
                continue;
            }
            $page = get_post($i->object_id);
            //si no es una página padre, continuar
            if (!isset($page->post_parent) || $page->post_parent != 0) {
                continue;
            }
            $children = get_pages( array('child_of' => $i->object_id) );
            foreach ((array)$children as $c) {
                //establecer menú padre
                $c->menu_item_parent      = $i->ID;
                $c->object_id             = $c->ID;
                $c->object                = 'page';
                $c->type                  = 'post_type';
                $c->type_label            = 'Página';
                $c->url                   = get_permalink( $c->ID);
                $c->title                 = $c->post_title;
                $c->target                = '';
                $c->attr_title            = '';
                $c->description           = '';
                $c->classes               = array('','menu-item','menu-item-type-post_type','menu-item-object-page');
                $c->xfn                   = '';
                $c->current               = ($post->ID == $c->ID)? true: false;
                $c->current_item_ancestor = ($post->ID == $c->post_parent)? true: false; //probablemente no sea correcto
                $c->current_item_parent   = ($post->ID == $c->post_parent)? true: false;
                $tmp[] = $c;
            }
        }
        return $tmp;
    }
}
new auto_child_page_menu();
27 may 2013 12:05:41
Comentarios

¡Funciona perfectamente, muchas gracias por tu ayuda Bainternet! Muy apreciado.

Desmond Desmond
29 may 2013 14:13:04

Perdón por preguntar esto pero, ¿cómo debo usar esto? ¿pegarlo en functions.php y llamarlo desde el lugar donde debería ir el menú?

1GR3 1GR3
29 may 2014 19:14:16

Estoy con @1GR3, ¿cómo usamos esto?

Spedwards Spedwards
1 mar 2015 07:16:37

Sí, simplemente añade esto al archivo functions.php y guarda los cambios.

David Shaw David Shaw
23 ene 2018 17:10:30

Buen intento, pero ¡ESTO NO FUNCIONA! Añade TODAS las páginas hijas bajo el padre de nivel superior como si fueran hijos de primer nivel. Las páginas hijas de segundo y tercer nivel también se añaden bajo el padre de nivel superior. Me arruinó completamente la navegación.

Joe Bloggs Joe Bloggs
12 may 2019 04:33:30

Lo siento, no puedo publicar una respuesta limpia porque no tengo suficiente reputación en este sitio. Para los interesados, añadí un poco de código para mejorar esta función.

Añadí otra condición para agregar la clase al elemento de lista padre, por ejemplo: if (count($children)>0) $i->classes[] = 'menu-item-has-children';

Shad Gagnon Shad Gagnon
15 abr 2022 01:00:33
Mostrar los 1 comentarios restantes