¿Hay documentación para el argumento "items_wrap" de wp_nav_menu?

5 jun 2011, 08:01:58
Vistas: 64.3K
Votos: 52

Estoy usando wp_nav_menu e intento crear una salida personalizada para los menús desplegables de subnivel. Me encontré con el argumento "items_wrap" pero realmente no hay mucha información sobre qué es, cómo funciona y qué tipo de cosas se pueden hacer con él.

¿Qué son exactamente "%1$s" y "%2$s"? (¿Alguien puede explicarlo en términos simples?)

0
Todas las respuestas a la pregunta 2
5
70

El parámetro 'items_wrap' para wp_nav_menu() tiene como valor predeterminado:

'<ul id="%1$s" class="%2$s">%3$s</ul>' 

Este es una plantilla que se analiza con sprintf():

$nav_menu .= sprintf( 
    $args->items_wrap
,   esc_attr( $wrap_id )    // %1$s
,   esc_attr( $wrap_class ) // %2$s
,   $items                  // %3$s
);

Los marcadores de posición numerados – %1$s, %2$s, %3$s – se refieren a los argumentos después del primer argumento en sprintf(). El signo de porcentaje marca un marcador de posición, el número la posición y el tipo s significa que debe tratarse como una cadena.
No cambies el tipo a menos que realmente sepas lo que estás haciendo. :)

  • $wrap_id es el parámetro 'menu_id' si lo has establecido, de lo contrario es 'menu-' . $menu->slug.
  • $wrap_class es el parámetro 'menu_class' si lo has establecido, de lo contrario está vacío.
  • $items es una cadena del contenido interno del menú.

Digamos que no necesitas un class. Simplemente omite la segunda cadena:

wp_nav_menu( array( 'items_wrap' => '<ul id="%1$s">%3$s</ul>' ) );

Si no necesitas el class ni el id, y quieres otro contenedor (porque usaste un walker personalizado):

wp_nav_menu( array( 'items_wrap' => '<div>%3$s</div>' ) );

El punto principal es: Debes usar los números para los reemplazos dados en wp_nav_menu(). %3$s siempre es la lista de elementos.

5 jun 2011 08:58:05
Comentarios

Gracias por intentar explicarlo. Más o menos lo entiendo pero no me funciona. Quiero añadir digamos una clase a mis elementos li. Parece que estás usando ul para cada elemento? Tampoco veo ningún sprintf en mi código así que no está claro.

landed landed
9 sept 2016 15:31:04

@landed Esto es para todo el menú, no para cada elemento. Por favor usa nuestro buscador, ya tenemos soluciones existentes para tu problema.

fuxia fuxia
9 sept 2016 16:27:01

Busqué en la web y otros tenían el mismo problema, necesité extender la clase walker y añadir mi html ahí, esto funcionó bien para mi pero tuve que copiar bastante código de la clase antigua y renombrarlo y cambiarlo, luego configurar el menú para usar mi clase walker personalizada. Gracias

landed landed
10 sept 2016 20:29:29

Puede que llegue un poco tarde a la fiesta, pero si quisieras introducir texto en items_wrap, ¿cómo lo internacionalizarías (i18n)?

henrywright henrywright
19 sept 2016 15:42:44

@henrywright Primero traduce los valores y luego pásalos a la cadena.

fuxia fuxia
19 sept 2016 15:59:53
0

Por lo que entiendo, toma una salida y le asigna al elemento li un id y una clase con el nombre del menú. Así que cuando quieres dar estilo a un menú en particular, tomas su id y/o clase si deseas estilizarlo. El 1 y 2 simplemente son diferentes formatos de salida.

5 jun 2011 08:12:36