Agregar clase a un enlace específico en un menú personalizado
Sé que se puede agregar una clase en las opciones del menú personalizado, pero esto la agrega al elemento LI antes del A. Quiero aplicar la clase directamente a este A específico en lugar de todo el LI.
Entonces, en lugar de que la salida sea
<li id="menu-item-51" class="NEWCLASS menu-item menu-item-type-custom menu-item-51"><a href="#">Enlace</a> </li>
Quiero que sea así.
<li id="menu-item-51" class="menu-item menu-item-type-custom menu-item-51"><a href="#" class="NEWCLASS">Enlace</a></li>
¿Alguna idea?

puedes usar el filtro nav_menu_css_class
add_filter('nav_menu_css_class' , 'my_nav_special_class' , 10 , 2);
function my_nav_special_class($classes, $item){
if(tu condición){ //ejemplo: puedes verificar el valor de $item para decidir algo...
$classes[] = 'my_class';
}
return $classes;
}
Usando este $item puedes aplicar cualquier condición que desees. y esto agregará la clase al li específico y podrás dar estilo a la etiqueta a basado en eso así:
.my_class a{
background-color: #FFFFFF;
}

Encontré una solución en este sitio a través de el uso de un walker personalizado.
Dos pasos: reemplazar el código wp_nav_menu predeterminado con uno editado, y luego agregar código al functions.php del tema.
Primero, reemplaza el código wp_nav_menu predeterminado con lo siguiente (el código está copiado del sitio mencionado):
wp_nav_menu( array(
'menu' => 'Main Menu',
'container' => false,
'menu_class' => 'nav',
'echo' => true,
'before' => '',
'after' => '',
'link_before' => '',
'link_after' => '',
'depth' => 0,
'walker' => new description_walker())
);
Luego, agrega el siguiente código a functions.php. Haciendo esto puedes realmente agregar una clase a los enlaces del menú:
class description_walker extends Walker_Nav_Menu
{
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 . '<li id="menu-item-'. $item->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 ) .'"' : '';
$prepend = '<strong>';
$append = '</strong>';
$description = ! empty( $item->description ) ? '<span>'.esc_attr( $item->description ).'</span>' : '';
if($depth != 0)
{
$description = $append = $prepend = "";
}
$item_output = $args->before;
$item_output .= '<a'. $attributes .'>';
$item_output .= $args->link_before .$prepend.apply_filters( 'the_title', $item->title, $item->ID ).$append;
$item_output .= $description.$args->link_after;
$item_output .= '</a>';
$item_output .= $args->after;
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
if ($item->menu_order == 1) {
$classes[] = 'first';
}
}
}
Hacia el final del código hay varias líneas que comienzan con $item_output. En particular, debes mirar este fragmento:
$item_output .= '<a'. $attributes .'>';
Porque esta línea determina la salida para el inicio del html del enlace. Si lo cambias a algo como esto:
$item_output .= '<a'. $attributes . 'class="abc"' .'>';
Entonces todos tus enlaces en el menú tendrán class="abc" agregado.
Dicho esto, no permite una clase personalizada para cada enlace (o al menos no sé cómo codificarlo). Esto es un problema para mí.
Para aquellos que preguntan ¿por qué querrías hacer esto? Quiero que los enlaces de mi menú abran lightboxes (colorboxes, para ser más específico), y requieren clases en los enlaces para hacer eso. Por ejemplo:
<a class="lightbox1" href="#">Foto</a>
¿Hay alguna forma posible de generar dinámicamente las clases, como "lightbox1" para el primer enlace, "lightbox2" para el segundo enlace, y así sucesivamente?

@Rainman tu respuesta me ayudó un poco y planteaste una buena pregunta. Estoy seguro de que has encontrado una mejor solución, pero para aquellos que no, utilicé una versión modificada de la solución encontrada aquí: http://www.wpbeginner.com/wp-themes/how-to-add-custom-items-to-specific-wordpress-menus/

¡SOLUCIONADO! Necesitaba resolver esto para que el enlace del elemento del menú apunte a HTML en línea en un fancybox. Pega el siguiente código en el functions.php de tu tema:
function add_menuclass($ulclass) {
return preg_replace('/<a rel="fancybox"/', '<a class="fancybox"', $ulclass, -1);
}
add_filter('wp_nav_menu','add_menuclass');
Luego... en la pestaña Menú del Panel de WordPress, crea un enlace personalizado y agrégalo a tu menú. En la parte superior donde dice "Opciones de pantalla", asegúrate de tener marcado "Relación de enlace (XFN)". Esto agregará ese campo a tu elemento de menú personalizado. Escribe "fancybox" (sin comillas) en el campo y guarda tu menú.
La función busca la llamada al menú de navegación, luego encuentra donde tengas un rel="fancybox"
y lo reemplaza con un rel="fancybox" class="fancybox"
. Puedes reemplazar "fancybox" con la clase que necesites agregar a tus elementos de menú. ¡Listo!

¡Excelente publicación! Solo un detalle a tener en cuenta. El código no funcionará si alguien añade un título. Me encontré con el mismo problema... Así que simplemente eliminé la etiqueta A del principio de ambos valores de reemplazo. Dejándome con algo como esto... return preg_replace('/rel="fancybox"/', 'class="fancybox"', $ulclass, -1); ¡El código funciona genial!

Las respuestas actuales no parecen reconocer que la pregunta es cómo agregar una clase al elemento a
y no al elemento li
, o son demasiado complicadas. Aquí hay un enfoque simple usando el filtro nav_menu_link_attributes
que te permite apuntar a un menú específico basado en su slug y a un enlace específico en ese menú basado en su ID. Puedes usar var_dump en $args y $item para obtener más formas de crear tu condición.
add_filter('nav_menu_link_attributes', 'custom_nav_menu_link_attributes', 10, 4);
function custom_nav_menu_link_attributes($atts, $item, $args, $depth){
if ($args->menu->slug == 'tu-slug-de-menu' && $item->ID == 1){
$class = "button";
// Asegúrate de no sobrescribir ninguna clase existente
$atts['class'] = (!empty($atts['class'])) ? $atts['class'].' '.$class : $class;
}
return $atts;
}

Tuve que hacer algo similar recientemente y descubrí otra forma. Tuve que agregar una clase similar para un plugin de lightbox Nivo. Así que agregué "nivo" al atributo rel ("Link Relationship (XFN)") y luego lo siguiente en el filtro nav_menu_link_attributes
.
function agregar_clase_nivo_menu($atts, $item, $args) {
if( is_array($atts) && !empty($atts['rel']) && $atts['rel'] = 'nivo' ) {
$atts['class'] = 'lightbox';
$atts['data-lightbox-type'] = 'inline';
}
return $atts;
}
add_filter('nav_menu_link_attributes','agregar_clase_nivo_menu', 0,3);
