Agregar páginas hijas automáticamente al menú de navegación
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?
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();

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

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ú?

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

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.

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';
