Aggiungere automaticamente le pagine figlie al menu di navigazione
Ho creato un menu personalizzato in WordPress che contiene link a post e pagine. Lo sto aggiungendo all'header usando questa riga di codice:
<?php
wp_nav_menu(
array(
'theme_location' => 'primary',
'depth' => 0,
'menu_class' => 'nav-menu',
)
);
?>
Il mio problema è che se aggiungo una pagina figlia a quelle di livello superiore nel menu, non appaiono automaticamente come sottolink nella navigazione. So che posso crearle manualmente ogni volta ricostruendo il menu, ma vorrei poter semplicemente aggiungere una pagina figlia nella sezione pagine e farla apparire nel nav senza dover andare nel menu e ricostruirlo anche lì, se ha senso?
Ho provato a usare depth => 0
, ma non ha funzionato. C'è un modo per far apparire le pagine figlie senza doverle costruire nel menu personalizzato?
ecco come:
/**
* auto_child_page_menu
*
* classe per aggiungere dinamicamente voci di menu per tutte le pagine figlie al menu principale
* @author Ohad Raz <admin@bainternet.info>
*/
class auto_child_page_menu
{
/**
* costruttore della classe
* @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 funzione magica che aggiunge le pagine figlie
* @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;
//se non è una pagina, continua
if ($i->object != 'page'){
continue;
}
$page = get_post($i->object_id);
//se non è una pagina genitore, continua
if (!isset($page->post_parent) || $page->post_parent != 0) {
continue;
}
$children = get_pages( array('child_of' => $i->object_id) );
foreach ((array)$children as $c) {
//imposta il menu genitore
$c->menu_item_parent = $i->ID;
$c->object_id = $c->ID;
$c->object = 'page';
$c->type = 'post_type';
$c->type_label = 'Pagina';
$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; //probabilmente non corretto
$c->current_item_parent = ($post->ID == $c->post_parent)? true: false;
$tmp[] = $c;
}
}
return $tmp;
}
}
new auto_child_page_menu();

Funziona perfettamente, grazie mille per il tuo aiuto Bainternet! Molto apprezzato.

Scusa se lo chiedo, ma come dovrei usare questo? Incollarlo in functions.php e chiamarlo dal punto dove dovrebbe andare il menu?

Buon tentativo, ma questo NON FUNZIONA! Aggiunge TUTTE le pagine figlie sotto il genitore di livello superiore come se fossero figli di primo livello. Le pagine figlie di secondo e terzo livello vengono anch'esse aggiunte sotto il genitore di livello superiore. Ha completamente scombussolato la mia navigazione.

Scusa, non posso pubblicare una risposta pulita perché non ho abbastanza reputazione su questo sito. Per le persone interessate, ho aggiunto del codice per migliorare questa funzione.
Ho aggiunto un'altra condizione per aggiungere la classe all'elemento della lista genitore, ad esempio: if (count($children)>0) $i->classes[] = 'menu-item-has-children';
