Custom Walker: come ottenere l'ID nella funzione start_lvl
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";
}

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

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

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

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

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

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

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

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!

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.

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.

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.

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

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.

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

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

@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.

@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.
