it-swarm.com.de

Benutzerdefinierter Walker: So erhalten Sie die ID in der Funktion start_lvl

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

Ich musste dies nur in einem meiner Themen tun ... Da Sie zu diesem Zeitpunkt in 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;
  }

 }
30
Lane

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

Hierbei wird nicht die Seiten-ID verwendet, 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.

3
Sean Donovan

Sie können den folgenden Filter in Ihrer start_el -Funktion verwenden und Ihr Argument in der start_lvl -Funktion grubben.

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

Bitte lassen Sie mich wissen, ob es funktioniert.

2
Nabajit Roy

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 oben und fügen Sie vor dem Aufruf von wp_list_pages () die benutzerdefinierte Walker-Klasse hinzu:

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

0
AlxVallejo