Custom Walker: Wie bekomme ich eine ID in der Funktion start_lvl?

14

Ich mache meinen ersten Custom-Walker, der ein Akkordeon-Menü zusammenstellt. Zunächst habe ich dieses Beispiel verwendet: http://bitacre.com/2025/custom-nav-menu-walker-for-wordpress-themes

Es gibt zwei Funktionen. Zuerst start_lvl und dann start_el.

In start_el wird die ID durch $ item-> ID implementiert. Weiß jemand, wie ich das auch in start_lvl machen kann? Ich muss der (umgebenden untergeordneten Navigation) eine ID geben, damit sie im Akkordeonmenü ausgeblendet wird.

Was ich versuche zu generieren, ist ungefähr so:

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

Mein Code für die start_lvl Funktion:

// 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";
}
Robert Bouten
quelle

Antworten:

37

Ich musste dies nur in einem meiner Themen tun ... Da Sie zu diesem Zeitpunkt im Walker keinen Zugriff auf die Variable $ item haben, möchten Sie Ihr aktuelles Element zu diesem Zeitpunkt in einem globaleren Bereich speichern habe Zugriff darauf. Der folgende Code ist sinnvoller ... Hinweis: Ich habe alles außer dem relevanten Code entfernt.

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

 }
Fahrbahn
quelle
3
Dies ist die eleganteste Lösung, die in diesem Thread vorgestellt wird. Vielen Dank Lane!
Kevin C.
1
In der Tat ein sehr sauberer Ansatz, der gut funktioniert. Danke vielmals.
Isaac Gregson
1
Ich bin nicht sicher, aber muss ich den gesamten Standardcode zu start_el hinzufügen, damit es funktioniert?
GDY
4
Ok, Sie können einfach parent :: start_el verwenden ($ output, $ item, $ depth, $ args, $ id); in the start_el ...
GDY
Genial, wollte das schon seit Ewigkeiten herausfinden und das hat sofort funktioniert. Vielen Dank.
CFX
3

Ich hatte ein ähnliches Problem und löste es mithilfe einer statischen Variablen in der Klasse:

static protected $menu_lvl; 

Und dann habe ich im "display_element" die Variable erhöht:

self::$menu_lvl++;

In meinem Code habe ich dann in der Funktion start_lvl so etwas referenziert:

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

Dies verwendet nicht die Seiten-ID, sondern eine eindeutige ID für UL-Anweisungen, auf die das Javascript verweisen kann.

Übrigens - Dies ist wirklich nur nützlich für verschachtelte Akkordeons oder klickbare verschachtelte Dropdowns im Roots-Design mit Bootstrap für mobile Apps.

Sean Donovan
quelle
2

Sie können den folgenden Filter in Ihrer start_elFunktion verwenden und Ihr Argument in der start_lvlFunktion grubben .

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

Bitte lassen Sie mich wissen, ob es funktioniert.

Nabajit Roy
quelle
Danke fürs Schreiben! Ich hoffe, in den nächsten Tagen etwas Zeit zu finden, um das herauszufinden, aber ich bin gerade sehr beschäftigt mit meinem Studium. Ich melde mich mit dem Ergebnis!
Robert Bouten
0

Sie können einfach $ page zum Argument des benutzerdefinierten Walkers hinzufügen:

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

Versuchen Sie es wie oben und fügen Sie die benutzerdefinierte Walker-Klasse hinzu, bevor Sie wp_list_pages () aufrufen:

$MyWalker = new My_Custom_Walker();

Dann in den Argumenten für wp_list_pages:

wp_list_pages ('walker' => $ MyWalker)

Überprüfen Sie, ob der Ausgang des Laufwagens rot ist.

AlxVallejo
quelle
Das ist in der Funktion start_el, aber es ist anscheinend anders in start_lvl, weil ich dort nicht die gleichen Variablen einfügen kann. Oder zumindest nicht die gleiche Reihenfolge.
Robert Bouten
Was versuchst du mit start_lvl zu tun?
AlxVallejo
Ich versuche, dem <ul> eine id = "collapse102" mit 102 der generierten Seiten-ID zu geben. Auf diese Weise kann ich es auslösen, um es in meinem Akkordeonmenü zu reduzieren.
Robert Bouten
Hinzufügen der ID = "Collapse" funktioniert, aber ich kann es nicht zum Funktionieren bringen, um die PageID auch hinzuzufügen.
Robert Bouten
Meinen Sie damit, dass nur bestimmte IDs ausgeblendet werden sollen? Ich habe einen Akkordeonbaum für wp_list_pages und muss start_lvl überhaupt nicht ändern.
AlxVallejo