Wie übergebe ich meinem benutzerdefinierten Walker ein Argument?

Ich habe einen benutzerdefinierten Walker eingerichtet, und es funktioniert wie gewünscht, wenn ich meine Variable fest codiere.

Was ich will, ist in der Lage zu sein, meinen Geher zu nennen und ihm eine Variable zu übergeben, die im Gehwagen verwendet wird.

Beispielsweise:

'walker' => new Plus_walker($refine => 'review'), 

Der Walker, den ich optimiert habe, um http: // URL / review auszugeben, um Beiträge in der Review-Kategorie für diesen Menüpunkt zu finden. Aber ich möchte den gleichen Walker für “Previews”, “Interviews” und mehr verwenden können. Bis jetzt haben meine Versuche, Variablen einzugeben, nur die ganze Sache durchbrochen, ‘Parse error: syntax error, unexpected T_DOUBLE_ARROW’.

Ich weiß, ich könnte den Code einfach umschreiben und ein paar verschiedene Walker machen (Review_walker, Preview_walker usw.), aber das scheint einfach falsch zu sein (und ich denke, das könnte eine wichtige Sache sein, die man wissen sollte …)

Mein Walker-Code ist hier:

 class plus_walker extends Walker_Nav_Menu { var $refine; function __construct($refine) { $this->refine = $refine; } function start_el(&$output, $item, $depth, $args) { global $wp_query; $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; $class_names = $value = ''; $classes = empty( $item->classes ) ? array() : (array) $item->classes; $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) ); $class_names = ' class="'. esc_attr( $class_names ) . '"'; $output .= $indent . '
  • ID . '"' . $value . $class_names .'>'; $attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : ''; $attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : ''; $attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : ''; $attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) . '' : ''; //This is where I want the argument to live. $modded_url = substr($attributes,0,-1) . '+' . $refine . '"'; $item_output = $args->before; $item_output .= ''; $item_output .= $args->link_before .$prepend.apply_filters( 'the_title', $item->title, $item->ID ).$append; $item_output .= $description.$args->link_after; $item_output .= ''; $item_output .= $args->after; $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args ); } }
  • Und der PHP-Aufruf in meinen Vorlagen:

      'Handheld', 'container' => 'div', 'container_class' => 'col_1', //'container_id' => , 'menu_class' => 'menu', // 'menu_id' => , 'echo' => true, 'fallback_cb' => 'wp_page_menu', 'items_wrap' => '
      %3$s
    ', 'depth' => 0, 'walker' => new Plus_walker(array($refine => 'review')), ) ); ?>

    Ich habe eine Reihe von verschiedenen Konfigurationen ausprobiert: ‘verfeinern’ => ‘review, mit und ohne Array, aber immer noch keine Freude, nur Fehler (unerwartet’ => ‘meistens).

    Solutions Collecting From Web of "Wie übergebe ich meinem benutzerdefinierten Walker ein Argument?"

    Native Walker werden mit der Methode walk() ausgetriggers und sind nicht dafür eingerichtet, Daten zur Erstellung zu empfangen. Zu diesem Zweck können Sie eine benutzerdefinierte Eigenschaft und eine Konstruktormethode definieren:

     class plus_walker extends Walker_Nav_Menu { var $refine; function __construct($refine) { $this->refine = $refine; } } //stuff 'walker' => new plus_walker('review'); 

    Danach können Sie auf Ihre benutzerdefinierten Daten als $this->refine in Walker-Methoden $this->refine .

    Eine andere Möglichkeit besteht darin, der function wp_nav_menu() ein benutzerdefiniertes Argument wp_nav_menu() . Dies ist praktisch, wenn Sie einen Wert von außerhalb der Walker-class insgesamt übergeben müssen:

     wp_nav_menu( array( 'theme_location' => 'secondary', 'depth' => 1, 'walker' => new Custom_Walker(), 'walker_arg' => 'Custom argument value here' ) ); 

    Innerhalb der Walker-class können Sie dann innerhalb der Walker-class ( Walker_Nav_Menu::start_el() ) wie Walker_Nav_Menu::start_el() auf dieses benutzerdefinierte start_el() innerhalb der function Walker_Nav_Menu::start_el() :

     $custom_arg = esc_attr( $args->walker_arg ); 

    Hoffentlich hilft das, es hilft mit ein paar obskuren Szenarien, die ich gefunden habe, dass die Empfehlung von Rarst oben vielleicht nicht gut umgehen kann.

    Sie können das benutzerdefinierte Argument einfach mit einer leicht veränderten function start_el() .

    Rufen Sie zuerst das Element wp_nav_menu (oder einen anderen wp_nav_menu die function verwendet) mit den in Kevin Learys Antwort angegebenen Argumenten auf.

    In der start_el function in Ihrem benutzerdefinierten Walker können Sie einfach über $args['walker_arg'] auf Ihre Daten $args['walker_arg'] . walker_arg , dass walker_arg an Ihre Bedürfnisse walker_arg kann.

    Zusätzlich dazu und teilweise mit Kevin Learys Lösung können Sie mehr als ein benutzerdefiniertes Argument an den Walker übergeben!