Custom Walker: come ottenere l'ID nella funzione start_lvl

16 ago 2012, 22:57:02
Visualizzazioni: 18.1K
Voti: 21

Sto creando il mio primo custom walker per costruire un menu ad accordion. Per iniziare ho usato questo esempio: http://bitacre.com/2025/custom-nav-menu-walker-for-wordpress-themes

Ci sono due funzioni. Prima start_lvl e poi start_el.

In start_el l'ID viene implementato tramite $item->ID. Qualcuno sa come posso fare lo stesso in start_lvl? Ho bisogno di dare al (menu di livello inferiore circostante) un ID così posso attivare il collassamento nel menu ad accordion.

Quello che sto cercando di generare è qualcosa del genere:

<a href="#collapse2">Titolo 2</a>
<ul id="collapse2">Menu di livello inferiore 2</ul>
<a href="#collapse3">Titolo 3</a>
<ul id="collapse3">Menu di livello inferiore 3</ul>

Il mio codice per la funzione start_lvl:

// aggiungi id e classi agli ul dei sub-menu
function start_lvl( &$output, $depth, $item ) {
    // classi dipendenti dalla profondità
    $indent = ( $depth > 0  ? str_repeat( "\t", $depth ) : '' ); // indentazione del codice
    $display_depth = ( $depth + 1); // perché conta il primo submenu come 0
    $pgid = ; // Come ottenere l'ID qui??
    $classes = array(
        'sub-menu',
        ( $display_depth == 1  ? 'accordion-body collapse' : '' ),
        ( $display_depth % 2  ? 'menu-odd' : 'menu-even' ),
        ( $display_depth >=2 ? 'sub-sub-menu' : '' ),
        'menu-depth-' . $display_depth
        );
    $ids = array(
        'collapse' . $pgid
        );
    $class_names = implode( ' ', $classes );
    $id_name = implode( ' ', $ids );

    // costruisci html
    $output .= "\n" . $indent . '<ul id="' . $id_name . '" class="' . $class_names . '">' . "\n";
}
0
Tutte le risposte alla domanda 3
7
52

Ho dovuto fare questa cosa in uno dei miei temi... Dato che non hai accesso alla variabile $item in quella fase del Walker, vorrai memorizzare l'elemento corrente in un ambito più globale nel momento in cui hai effettivamente accesso ad esso. Il seguente codice avrà più senso... nota: ho rimosso tutto tranne il codice rilevante.

class ThemeTruck_Nav_Walker extends Walker_Nav_Menu {
   private $curItem;

  // recupera il curItem
  function start_lvl(&$output, $depth = 0, $args = array()) {
    var_dump($this->curItem );
  }

  // memorizza il curItem
  function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) {
    $this->curItem = $item;
  }

 }
3 gen 2013 07:34:27
Commenti

Questa è la soluzione più elegante presentata in questo thread. Grazie Lane!

Kevin C. Kevin C.
1 giu 2013 01:05:44

Davvero un approccio molto pulito che funziona bene. Molte grazie.

Isaac Gregson Isaac Gregson
1 giu 2015 20:08:13

Non sono sicuro, ma devo aggiungere tutto il codice predefinito a start_el per farlo funzionare?

GDY GDY
7 feb 2017 09:27:55

Puoi semplicemente usare parent::start_el($output,$item,$depth,$args,$id); nello start_el ...

GDY GDY
7 feb 2017 09:37:40

Fantastico, volevo capire come fare questa cosa da tempo e ha funzionato subito. Grazie.

cfx cfx
21 giu 2018 04:55:47

Ottimo!! Devo costruire un menu molto grande e la tua soluzione è perfetta. Grazie!

Jankyz Jankyz
17 gen 2020 16:35:38

Anni dopo questo mi ha salvato! Grazie :)

Paxjah Paxjah
5 feb 2024 21:00:33
Mostra i restanti 2 commenti
2

Puoi utilizzare il seguente filtro nella tua funzione start_el e recuperare il tuo argomento nella funzione start_lvl.

apply_filters( 'walker_nav_menu_start_lvl', $item_output, $item, $depth, $args->myarg=$item->title );

Fammi sapere se funziona.

16 set 2012 12:43:17
Commenti

Grazie per aver pubblicato! Spero di trovare un po' di tempo per risolverlo nei prossimi giorni, ma al momento sono davvero impegnato con lo studio. Ti farò sapere il risultato!

Robert Bouten Robert Bouten
17 set 2012 23:09:14

Non sono sicuro se questo filtro sia mai esistito, ma in WP 5.5 non vedo che esista un filtro del genere

Alexander Holsgrove Alexander Holsgrove
28 ott 2020 21:11:13
11
-1

Puoi semplicemente aggiungere $page all'argomento del walker personalizzato:

class My_Custom_Walker extends Walker_page {
    function start_el(&$output, $page, $depth, $args, $current_page) {
        if ( $depth )
            $indent = str_repeat("\t", $depth);
        else
            $indent = '';

        extract($args, EXTR_SKIP);

        $output .= $indent . 
            '<li>
            <a style="color:red" href="' . get_page_link($page->ID) . '" title="' . 
            esc_attr( wp_strip_all_tags( apply_filters( 'the_title', $page->post_title, $page->ID ) ) ) . '">' . 
            $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after . '</a>';

Prova il codice sopra e prima di chiamare wp_list_pages(), aggiungi la classe del walker personalizzato:

$MyWalker = new My_Custom_Walker();

Poi, negli argomenti per wp_list_pages:

wp_list_pages('walker' => $MyWalker)

Controlla e verifica se l'output del walker risulta rosso.

16 ago 2012 23:29:00
Commenti

Questo è nella funzione start_el, ma apparentemente è diverso in start_lvl perché non posso inserire le stesse variabili lì. O almeno non nello stesso ordine.

Robert Bouten Robert Bouten
16 ago 2012 23:38:57

Cosa stai cercando di fare con start_lvl?

AlxVallejo AlxVallejo
16 ago 2012 23:40:45

Sto cercando di dare all'<ul> un id="collapse102" con 102 che è l'ID della pagina generata. In questo modo posso attivarlo per collassarlo nel mio menu ad accordion.

Robert Bouten Robert Bouten
16 ago 2012 23:50:50

Aggiungere l'id="collapse" funziona, ma non riesco a farlo funzionare per aggiungere anche il pageID.

Robert Bouten Robert Bouten
16 ago 2012 23:51:58

Intendi che vuoi che solo ID specifici siano collassati? Ho un accordion tree per wp_list_pages e non ho bisogno di modificare start_lvl per niente.

AlxVallejo AlxVallejo
16 ago 2012 23:54:56

Ho aggiunto un esempio di quello che sto cercando di generare

Robert Bouten Robert Bouten
16 ago 2012 23:59:43

È per wp_nav_menu, non so se faccia qualche differenza per wp_list_pages

Robert Bouten Robert Bouten
17 ago 2012 00:00:45

Ciao AlxVallejo, non riesco a farlo funzionare come pensavo, quindi devo cambiare approccio. Come hai realizzato il tuo accordion per wp_list_pages?

Robert Bouten Robert Bouten
20 ago 2012 18:14:06

@RobertBouten Ho aggiornato la mia risposta. In realtà sto usando un plugin chiamato list-pages-shortcode così non devo richiamare la classe su ogni template di pagina. Fammi sapere come va.

AlxVallejo AlxVallejo
20 ago 2012 18:59:22

@RobertBouten Capisco che questo non ti porta al 100% all'accordion, che dipenderà dal jQuery che utilizzi. Molto probabilmente dovresti assegnare a ogni link una classe da richiamare dal DOM jQuery. Sarò felice di guidarti attraverso come l'ho fatto io.

AlxVallejo AlxVallejo
20 ago 2012 19:42:23

Grazie Alx, inizierò a lavorarci e ti farò sapere se avrò altre domande.

Robert Bouten Robert Bouten
21 ago 2012 23:34:28
Mostra i restanti 6 commenti