Walker personalizzato: come ottenere l'ID nella funzione start_lvl


14

Sto realizzando il mio primo walker personalizzato per creare un menu a fisarmonica. 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 get è implementato da $ item-> ID. Qualcuno sa come posso farlo anche in start_lvl? Devo fornire un ID (navigazione di livello inferiore circostante) in modo da poterlo attivare nel menu a fisarmonica.

Quello che sto cercando di generare è qualcosa del genere:

<a href="#collapse2">Titel 2</a>
<ul id="collapse2">Lower Level Menu 2</ul>
<a href="#collapse3">Titel 3</a>
<ul id="collapse3">Lower Level Menu  3</ul>

Il mio codice per la funzione start_lvl:

// add id's and classes to ul sub-menus
function start_lvl( &$output, $depth, $item ) {
    // depth dependent classes
    $indent = ( $depth > 0  ? str_repeat( "\t", $depth ) : '' ); // code indent
    $display_depth = ( $depth + 1); // because it counts the first submenu as 0
    $pgid = ; // How to get ID in here??
    $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 );

    // build html
    $output .= "\n" . $indent . '<ul id="' . $id_name . '" class="' . $class_names . '">' . "\n";
}

Risposte:


37

Ho dovuto farlo in uno dei miei temi ... Dal momento che non hai accesso alla variabile $ item in quella fase del Walker, vorrai archiviare l'oggetto corrente in un ambito più globale nel momento in cui avere accesso ad esso. Il seguente codice avrà più senso ... nota: ho eliminato tutto tranne il codice pertinente.

class ThemeTruck_Nav_Walker extends Walker_Nav_Menu {
   private $curItem;

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

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

 }

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

1
In effetti un approccio molto pulito che funziona bene. Grazie molto.
Isaac Gregson,

1
Non sono sicuro, ma devo aggiungere l'intero codice predefinito a start_el per farlo funzionare?
GDY

4
Ok puoi semplicemente usare parent :: start_el ($ output, $ item, $ depth, $ args, $ id); nello start_el ...
GDY

Fantastico, intendevo capirlo da secoli e ha funzionato subito. Grazie.
cfr

3

Ho avuto un problema simile e l'ho risolto utilizzando una variabile statica all'interno della classe:

static protected $menu_lvl; 

E poi in "display_element" ho incrementato la variabile:

self::$menu_lvl++;

Nel mio codice ho quindi fatto riferimento nella funzione start_lvl qualcosa del genere:

$output .= "<ul id='level". self::$menu_lvl ."'>";

Questo non utilizza l'ID pagina, ma utilizza un ID univoco per le dichiarazioni UL a cui può fare riferimento javascript.

A proposito: questo è davvero utile solo per fisarmoniche nidificate o menu a discesa annidati cliccabili nel tema Roots usando Bootstrap per le app mobili.


2

Puoi usare il seguente filtro nella tua start_elfunzione e grub il tuo argomento in start_lvlfunzione.

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

Per favore fatemi sapere se funziona.


Grazie per la pubblicazione! Spero di trovare un po 'di tempo per risolverlo nei prossimi giorni, ma sono davvero impegnato con il mio studio proprio ora. Ti risponderò con il risultato!
Robert Bouten,

0

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 quanto sopra e poi prima di chiamare wp_list_pages (), aggiungi la classe walker personalizzata:

$MyWalker = new My_Custom_Walker();

Quindi, negli argomenti per wp_list_pages:

wp_list_pages ('walker' => $ MyWalker)

Controllare e vedere se l'output del walker è rosso.


Questo è nella funzione start_el, ma apparentemente è diverso in start_lvl perché non riesco a inserire le stesse variabili. O almeno non nello stesso ordine.
Robert Bouten,

Cosa stai cercando di fare con start_lvl?
AlxVallejo,

Sto cercando di dare a <ul> un id = "collapse102" con 102 l'ID pagina generato. In questo modo posso attivarlo per comprimerlo nel mio menu a fisarmonica.
Robert Bouten,

L'aggiunta dell'id = "collapse" funziona, ma non riesco a farlo funzionare anche per aggiungere il pageID.
Robert Bouten,

Vuoi dire che vuoi solo comprimere ID specifici? Ho un albero a fisarmonica per wp_list_pages e non ho bisogno di cambiare start_lvl.
AlxVallejo,
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.