Dodaj niestandardowy walker do menu utworzonego w widżecie

10

Wiem, jak dodać Walkera do niestandardowego menu utworzonego przez motyw (menu nazwane primaryw tym przykładzie), ale jak mogę kierować reklamy do menu utworzonego w widżecie z domyślnym niestandardowym widżetem menu wordpress?

if ( has_nav_menu( 'primary' ) ) {

$args = array(
    'menu' => 'main-menu',
    'menu_id' => 'main-menu',
    'theme_location' => 'primary',
    'depth' => 0,
    'container' => false,
    'menu_class' => 'nav',
    'walker' => new Myprefix_Walker_Nav_Menu(),
    'echo' => 0
);

$nav = wp_nav_menu( $args );

}
Amy
źródło

Odpowiedzi:

14

Jeśli spojrzysz na implementację WP_Nav_Menu_Widgetklasy, zobaczysz następujący kod:

function widget($args, $instance) {
    // Get menu
    $nav_menu = ! empty( $instance['nav_menu'] ) ? wp_get_nav_menu_object( $instance['nav_menu'] ) : false;

    if ( !$nav_menu )
        return;

    $instance['title'] = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );

    echo $args['before_widget'];

    if ( !empty($instance['title']) )
        echo $args['before_title'] . $instance['title'] . $args['after_title'];

    wp_nav_menu( array( 'fallback_cb' => '', 'menu' => $nav_menu ) );

    echo $args['after_widget'];
}

Oznacza to, że nie ma szans na zaczepienie menu. Musisz więc przyjrzeć się wp_nav_menuimplementacji funkcji, w której można znaleźć następujące wiersze kodu:

$defaults = array(
  'menu' => '',
  'container' => 'div',
  'container_class' => '',
  'container_id' => '',
  'menu_class' => 'menu',
  'menu_id' => '',
  'echo' => true,
  'fallback_cb' => 'wp_page_menu',
  'before' => '',
  'after' => '',
  'link_before' => '',
  'link_after' => '',
  'items_wrap' => '<ul id="%1$s" class="%2$s">%3$s</ul>',
  'depth' => 0,
  'walker' => '',
  'theme_location' => ''
);

$args = wp_parse_args( $args, $defaults );
$args = apply_filters( 'wp_nav_menu_args', $args );
$args = (object) $args;

Tutaj widać, że wszystkie argumenty przekazane do wp_nav_menufunkcji można zastąpić. Tak więc potrzebujesz stworzyć własny uchwyt zaczepu, który doda walkera do menu nawigacji. Może to być proste:

function myplugin_custom_walker( $args ) {
    return array_merge( $args, array(
        'walker' => new My_Custom_Walker(),
        // another setting go here ... 
    ) );
}
add_filter( 'wp_nav_menu_args', 'myplugin_custom_walker' );
Eugene Manuilov
źródło
to świetnie, dziękuję. Wygląda na to, że powoduje to ustawienie domyślne dla wszystkich menu. Czy mam rację, zakładając, że kiedy go używam, utknąłem we wszystkich menu posiadających tego walkera? ponieważ próbowałem 'walker' => new Walker_Nav_Menu()w argumentach mojego konkretnego menu, aby ponownie go zastąpić, aby stać się domyślnym walkerem dla tylko jednego menu, ale niestety to nie działa.
amy
@amy tak, będzie domyślny dla wszystkich menu.
Eugene Manuilov
@amy możesz dołączyć kod do sprawdzenia argumentów. Następnie ustaw warunek „if”, niezależnie od tego, czy zastosujesz walker, czy nie.
Wayne,
4

Rozwijając odpowiedź @ Eugene'a, jeśli chcesz ograniczyć to do konkretnego menu, po prostu sprawdź identyfikator menu:

function custom_nav_args($args){
$menu = $args['menu'];
    if($menu->term_id === 17)  /* replace term_id with menu id, or use $menu->name to do it by menu name*/
    {
        $args['walker'] = new My_Custom_Walker();
    }
    return $args;
}
add_filter('wp_nav_menu_args', 'custom_nav_args');
Yaron
źródło
Jak filtrowalibyśmy według identyfikatora paska bocznego?
Steven Vachon
1

Jest to alternatywa dla celowania w menu przez term_idi pomyślałem, że może się przydać komuś jako sposób modyfikacji kilku menu bez konieczności sprawdzania ich identyfikatorów.

Dodając print_r($args)do filtra zauważyłem, że $args['menu']jest to ciąg znaków dla menu w predefiniowanych lokalizacjach motywu i WP_Term_Objectniestandardowego widżetu menu na pasku bocznym.

Użyłem tego do celowania w menu za pomocą ślimaka i dodawania klasy do ich kontenera. Można kierować na wiele menu, umieszczając wspólny ciąg w swoich ślimakach. Uwaga: ślimak menu pochodzi z klucza tablicy w register_nav_menus().

function my_menu_thingy( $args ) {
  if( is_object($args['menu']) && strpos($args['menu']->{slug},'my-common-string') !== false ) {
    $args['walker'] = new My_Custom_Walker();
  }
  return $args;
}
add_filter( 'wp_nav_menu_args', 'my_menu_thingy' );

W przypadku pojedynczego menu wystarczy sprawdzić to $args['menu']->{slug} == 'your-slug'zamiast bitu strpos () powyżej.

Jon
źródło
1

Możesz dodać niestandardowy walker do menu nawigacyjnego utworzonego w widżecie za pomocą widget_nav_menu_argsfiltra dodanego w wordpress 4.2.0. Akceptuje cztery argumenty (patrz wp-includes/widgets/class-wp-nav-menu-widget.php). Ale aby dodać tylko niestandardowy walker, wystarczy użyć pierwszego argumentu, w taki sam sposób jak wp_nav_menu_argsfiltr.

    add_filter('wp_nav_menu_args', 'my_args'); //for menus
    add_filter('widget_nav_menu_args', 'my_args'); //for menus in widgets
    function my_args($args) { //$args is only argument needed to add custom walker
       return array_merge( $args, array(
          'walker' => new My_Custom_Walker(),
       ) );
    }
komórkowość
źródło