Aggiungere automaticamente le pagine figlie al menu di navigazione

27 mag 2013, 08:17:06
Visualizzazioni: 13.9K
Voti: 5

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?

4
Commenti

L'unico modo che conosco è quando il tuo menu personalizzato è vuoto, WordPress lo riempirà con tutte le pagine esistenti. Una volta che inizi ad aggiungere pagine al suo interno, non continuerà più automaticamente.

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

Sembra che tu abbia un problema con la configurazione di un componente software. Ti preghiamo di contattare il fornitore di quel componente per le opzioni di supporto, questo sito riguarda domande di programmazione concrete, non su come utilizzare un'API specifica del fornitore.

hakre hakre
27 mag 2013 09:40:29

Grazie per la migrazione Toscho - non sapevo che esistesse questo forum.

Desmond Desmond
28 mag 2013 03:59:20

codice per menu con sottomenu da pagine e pagine figlie. Potrebbe aiutarti a costruire il tuo menu da pagine figlie e pagine figlie in modo pragmatico.

Core Core
28 mag 2013 09:37:49
Tutte le risposte alla domanda 1
6
14

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();
27 mag 2013 12:05:41
Commenti

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

Desmond Desmond
29 mag 2013 14:13:04

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

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

Sono d'accordo con @1GR3, come usiamo questo?

Spedwards Spedwards
1 mar 2015 07:16:37

Sì, basta aggiungere questo al file functions.php e premere salva!

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

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.

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

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

Shad Gagnon Shad Gagnon
15 apr 2022 01:00:33
Mostra i restanti 1 commenti