Agregue un andador personalizado a un menú creado en un widget

10

Sé cómo agregar un Walker a un menú personalizado creado por el tema (menú nombrado primaryen este ejemplo), pero ¿cómo puedo orientar un menú creado en un widget con el widget de menú personalizado de WordPress predeterminado?

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
fuente

Respuestas:

14

Si observa la implementación de la WP_Nav_Menu_Widgetclase, verá el siguiente código:

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

Significa que no hay ninguna posibilidad de conectar un menú. Por lo tanto, debe echar un vistazo a la wp_nav_menuimplementación de funciones, donde puede encontrar las siguientes líneas de código:

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

Aquí puede ver que todos los argumentos pasados ​​a la wp_nav_menufunción podrían ser reemplazados. Entonces, lo que necesita es crear su propio controlador de gancho que agregará su andador a un menú de navegación. Podría ser simple como:

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
fuente
Esto es genial, gracias. Parece que esto es el valor predeterminado para todos los menús. ¿Estoy en lo cierto al suponer que cuando uso esto estoy atascado con todos los menús que tienen este andador? porque intenté 'walker' => new Walker_Nav_Menu()en los argumentos de mi menú específico anularlo nuevamente para convertirme en el caminante predeterminado de wordpress para solo un menú, pero lamentablemente esto no funciona.
amy
@amy sí, será el valor predeterminado para todos los menús.
Eugene Manuilov
@amy puedes incluir código para examinar los argumentos. Luego ponga un if condicional si aplica el andador o no.
Wayne
4

Ampliando la respuesta de @ Eugene, si desea limitar esto a un menú específico, simplemente verifique el término ID del menú:

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
fuente
¿Cómo filtraríamos por ID de barra lateral?
Steven Vachon
1

Esta es una alternativa a apuntar a un menú term_idy pensé que podría ser útil para alguien como una forma de modificar varios menús sin tener que buscar sus identificadores.

Al agregar print_r($args)a un filtro, noté que $args['menu']es una cadena para menús en ubicaciones de tema predefinidas y WP_Term_Objectpara un widget de menú personalizado en una barra lateral.

Utilicé esto para apuntar menús por slug y agregar una clase a su contenedor. Se pueden seleccionar varios menús al incluir una cadena común en sus babosas. Nota: la babosa de menú proviene de la clave de matriz 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' );

Para un solo menú, solo debe verificar eso en $args['menu']->{slug} == 'your-slug'lugar del bit strpos () anterior.

Jon
fuente
1

Puede agregar un andador personalizado a un menú de navegación creado en un widget utilizando el widget_nav_menu_argsfiltro agregado en WordPress 4.2.0. Acepta cuatro argumentos (ver wp-includes/widgets/class-wp-nav-menu-widget.php). Pero para agregar solo un andador personalizado, solo necesita usar el primer argumento, de la misma manera que usa el wp_nav_menu_argsfiltro.

    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(),
       ) );
    }
celleness
fuente