start_lvl Ignorato in Custom walker_nav_menu


8

Questo è il mio primo progetto che coinvolge WordPress e mi sono bloccato cercando di creare un walker personalizzato per un menu a piè di pagina.

Fondamentalmente voglio cambiare il menu dalla <ul> <li></li> </ul>struttura a una <p> <span></span> </p>struttura.

Il menu e le cose stanno visualizzando il file e sono stato in grado di regolare le funzioni start_ele end_elsenza problemi, quindi ora ottengo questo:

<ul> <span>*link*</span> <span>*link*</span> </ul>

Il che è ovviamente a metà strada, ho scritto i tag start_lvl()e end_lvl()come mostrato di seguito ma sono ignorati da WordPress - nulla di ciò che ho inserito (anche die()) viene eseguito (il che è un po 'sospetto) ma so che la classe viene chiamata a causa di la start_el()funzione.

function start_lvl(&$output, $depth = 0, $args = array()) {
    $output = "\n<p class=\"sub-menu\">\n";
}

function end_lvl(&$output, $depth = 0, $args = array()) {
    $output .= "\n</p>\n";
}

Qualcuno sa perché questo sta accadendo: ho perso qualcosa di veramente ovvio !?

Sto eseguendo l'ultima versione di WordPress su Apache con PHP 5.3.6se aiuta.

Grazie in anticipo,

Felix :)


1
Sulla base di ciò che hai mostrato, tutte le cose ovvie sembrano corrette.
dal

Riferimenti incrociati wordpress.org/support/topic/…
Ian Dunn,

Risposte:


8

La tua classe my_extended_walker è OK, ma quando chiami la funzione wp_nav_menu usa il parametro items_wrap .

wp_nav_menu( array( 'items_wrap' => '<p>%3$s</p>', 'walker'=>new my_extended_walker() ) );

Start_lvl viene utilizzato per gli elementi figlio.


2
Start_lvl viene utilizzato per gli elementi figlio. mi hai appena salvato un sacco di cose nella vita
ashutosh,

3

Ok, non sono sicuro di cosa ho letto di sbagliato quando ho pubblicato questo, ma tutta la tua classe dovrebbe essere qualcosa del genere:

class my_extended_walker extends Walker_Nav_Menu {
    function start_lvl(&$output, $depth = 0, $args = array()) {
        $output .= "\n<p class=\"sub-menu\">\n";
    }

    function end_lvl(&$output, $depth = 0, $args = array()) {
        $output .= "\n</p>\n";
    }
}

E poi passa il 'walker' come parametro quando chiami wp_nav_menu

wp_nav_menu( array( 'walker'=>new my_extended_walker() ) );

Se ce l'hai, dovresti stare bene. Sto guardando il codice di lavoro che fa proprio questo. Non so se inserire <p>tag lì. Potresti ottenere un markup non valido.


Ciao, sì, l'ho fatto sotto è la lezione completa,
fenfe1

la classe BB_Nav_Footer_Walker estende Walker_Nav_Menu {funzione start_lvl (& $ output, $ depth = 0, $ args = array ()) {$ output = "\ n <p class = \" sottomenu \ "> \ n"; } funzione end_lvl (& $ output, $ depth = 0, $ args = array ()) {$ output. = "\ n </p> \ n"; }}
fenfe1

Ho provato a usare <div>invece di <p>solo per vedere se riesco a fare quelle funzioni per fare qualsiasi cosa, ma finora nessuna gioia :(
fenfe1

Il <div>e <p>non dovrebbe interrompere il Walker ma potrebbe comportare un markup non valido. Hai $output =e non $output .=nel tuo start_lvl. Ciò potrebbe causare problemi. È il Walker completo che hai pubblicato?
s_ha_dum,

Ciao sì, ho risolto il .=problema: questa è ora la classe completa (ho rimosso le funzioni start_lvl()e end_lvl()per vedere se hanno fatto la differenza) - pastebin.com/zfcBxHd8
fenfe1

2

Hai mai pensato di recuperare tutte le voci del menu di navigazione utilizzando la funzione integrata: wp_get_nav_menu_items();e di produrre manualmente i contenuti?

Esempio :: Creazione di un semplice elenco di menu

    // Get the nav menu based on $menu_name (same as 'theme_location' or 'menu' arg to wp_nav_menu)
    // This code based on wp_nav_menu's code to get Menu ID from menu slug

    $menu_name = 'custom_menu_slug';

    if ( ( $locations = get_nav_menu_locations() ) && isset( $locations[ $menu_name ] ) ) {
    $menu = wp_get_nav_menu_object( $locations[ $menu_name ] );

    $menu_items = wp_get_nav_menu_items($menu->term_id);

    $menu_list = '<ul id="menu-' . $menu_name . '">';

    foreach ( (array) $menu_items as $key => $menu_item ) {
        $title = $menu_item->title;
        $url = $menu_item->url;
        $menu_list .= '<li><a href="' . $url . '">' . $title . '</a></li>';
    }
    $menu_list .= '</ul>';
    } else {
    $menu_list = '<ul><li>Menu "' . $menu_name . '" not defined.</li></ul>';
    }
    // $menu_list now ready to output
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.