Agregar clase a un enlace específico en un menú personalizado

22 feb 2011, 22:12:06
Vistas: 36.6K
Votos: 10

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?

4
Comentarios

Para ser claro, ¿qué quieres decir con añadir clase? ¿Qué opciones haces click exactamente en el panel de administración?

Wordpressor Wordpressor
22 feb 2011 22:17:15

¿Cuál es el propósito de eso? Simplemente cambia tu selector de .class a .class a?

wyrfel wyrfel
22 feb 2011 23:06:25

Sí, tampoco lo entiendo, simplemente configura tu CSS para apuntar al enlace basado en el elemento contenedor <li>. Si tienes un submenú debajo de ese ítem en particular no hay problema, puedes manejarlo en el CSS (puedo dar ejemplos si es necesario).

t31os t31os
22 feb 2011 23:36:38

+1 por tu comentario @wyrfel ... @Picard102 echa un vistazo a la especificidad CSS. Esto también te explicará cómo seleccionar correctamente elementos HTML mediante CSS.

kaiser kaiser
25 mar 2011 15:51:42
Todas las respuestas a la pregunta 7
1
11

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;
}
22 feb 2011 23:10:55
Comentarios

Estoy intentando añadir una clase para elementos con una plantilla de página específica, pero no consigo que get_page_template_slug funcione. ¿Alguna idea?

Bill Bill
3 oct 2014 19:35:48
1

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?

29 mar 2011 09:47:52
Comentarios

@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/

NW Tech NW Tech
22 may 2013 01:27:38
1

¡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!

14 dic 2011 23:47:22
Comentarios

¡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!

User User
29 mar 2013 15:59:52
1

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;
}
6 mar 2016 22:17:16
Comentarios

muchas gracias, cambié el if por if ($args->theme_location == 'footer-menu' ) para seleccionar el menú por su ubicación, y todo funciona perfectamente

efirvida efirvida
20 abr 2018 21:48:36
0

Sé que esto se respondió hace mucho tiempo, pero solo como información general, encontré cómo agregar una clase a cada elemento del menú individualmente usando la opción "Pantalla" de la página de administración de WordPress para Menús Personalizados.

21 nov 2011 22:49:13
0

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);
8 ene 2015 03:28:56
0

En la parte superior de la página Apariencia -> Menús, haz clic para expandir las Opciones de pantalla, marca la casilla de Clases CSS. Ahora cuando expandas cada uno de los elementos del menú añadidos, verás un campo Clases CSS (opcional).

21 dic 2018 18:28:11