Adaugă Clasă la Link Specific în Meniul Personalizat

22 feb. 2011, 22:12:06
Vizualizări: 36.6K
Voturi: 10

Știu că poți adăuga o clasă în opțiunile meniului personalizat, dar aceasta se adaugă la elementul LI înainte de A. Vreau să aplic clasa direct acestui element A specific și nu întregului element LI.

Deci în loc ca rezultatul să fie

<li id="menu-item-51" class="NEWCLASS menu-item menu-item-type-custom menu-item-51"><a href="#">Link</a> </li>

Vreau să fie așa:

<li id="menu-item-51" class="menu-item menu-item-type-custom menu-item-51"><a href="#" class="NEWCLASS">Link</a></li>

Aveți vreo idee?

4
Comentarii

Doar ca să fie clar, la ce te referi prin adăugarea clasei? Ce opțiuni apăsați exact în panoul de administrare?

Wordpressor Wordpressor
22 feb. 2011 22:17:15

Care e rostul acestei abordări? Pur și simplu schimbați selectorul din .class în .class a?

wyrfel wyrfel
22 feb. 2011 23:06:25

Da, nici eu nu înțeleg logica, pur și simplu setați CSS-ul să țintească link-ul pe baza elementului părinte <li>. Dacă aveți un submeniu sub acel element specific, nu e nicio problemă, puteți gestiona și asta în CSS (pot da exemple dacă e necesar).

t31os t31os
22 feb. 2011 23:36:38

+1 pentru comentariul tău @wyrfel ... @Picard102 aruncă o privire la specificitatea css. Aceasta îți va explica și cum să țintești corect elementele html prin css.

kaiser kaiser
25 mar. 2011 15:51:42
Toate răspunsurile la întrebare 7
1
11

poți utiliza filtrul nav_menu_css_class

add_filter('nav_menu_css_class' , 'my_nav_special_class' , 10 , 2);
function my_nav_special_class($classes, $item){
    if(condiția ta){ //exemplu: poți verifica valoarea lui $item pentru a decide...
        $classes[] = 'my_class';
    }
    return $classes;
}

Folosind acest $item poți implementa orice condiție dorești. Aceasta va adăuga clasa la elementul li specific și poți stiliza tag-ul a în funcție de aceasta astfel:

.my_class a{
   background-color: #FFFFFF;
}
22 feb. 2011 23:10:55
Comentarii

Încerc să adaug o clasă pentru elementele cu un șablon de pagină specific, dar nu reușesc să fac get_page_template_slug să funcționeze. Aveți idei?

Bill Bill
3 oct. 2014 19:35:48
1

Am găsit o soluție pe acest site prin utilizarea unui walker personalizat.

Doi pași: înlocuiește codul implicit wp_nav_menu cu unul editat, apoi adaugă cod în functions.php al temei.

Mai întâi, înlocuiește codul implicit wp_nav_menu cu următorul (codul este copiat de pe site-ul menționat mai sus):

    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())
     );

Apoi, adaugă următorul cod în functions.php. Prin aceasta poți adăuga efectiv o clasă la link-urile din meniu:

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

        }
}

Spre finalul codului sunt câteva linii care încep cu $item_output. În special, vrei să te uiți la această bucată:

$item_output .= '<a'. $attributes .'>';

Pentru că această linie determină output-ul pentru începutul HTML-ului link-ului. Dacă o schimbi în ceva de genul:

$item_output .= '<a'. $attributes . 'class="abc"' .'>';

Atunci toate link-urile din meniu vor avea adăugată clasa="abc".


Cu toate acestea, nu permite o clasă personalizată pentru fiecare link (sau cel puțin nu știu cum să o codez). Aceasta este o problemă pentru mine.

Pentru cei care întreabă de ce ai vrea să faci asta? Vreau ca link-urile din meniul meu să deschidă lightbox-uri (mai exact colorbox-uri), iar acestea necesită clase pe link-uri pentru a funcționa. De exemplu:

<a class="lightbox1" href="#">Photo</a>

Există oare o modalitate de a genera clasele dinamic, cum ar fi "lightbox1" pentru primul link, "lightbox2" pentru al doilea link și așa mai departe?

29 mar. 2011 09:47:52
Comentarii

@Rainman răspunsul tău m-a ajutat puțin și ai pus o întrebare bună. Sunt sigur că ai găsit o soluție mai bună, dar pentru cei care nu au găsit, am folosit o versiune modificată a soluției găsite aici: http://www.wpbeginner.com/wp-themes/how-to-add-custom-items-to-specific-wordpress-menus/

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

REZOLVAT!!!! Am avut nevoie să găsesc această soluție pentru a face ca un element de meniu să se lege de HTML inline într-un fancybox. Lipiți următorul cod în fișierul functions.php al temei dumneavoastră:

function add_menuclass($ulclass) {
    return preg_replace('/<a rel="fancybox"/', '<a class="fancybox"', $ulclass, -1);
}
add_filter('wp_nav_menu','add_menuclass');

Apoi... în fila Meniu din Panoul de Control WordPress, creați un link personalizat și adăugați-l în meniu. În partea de sus unde scrie "Opțiuni Ecran", asigurați-vă că aveți bifată opțiunea "Relație Link (XFN)". Aceasta va adăuga câmpul respectiv la elementul de meniu personalizat. Tastați "fancybox" (fără ghilimele) în acel câmp și salvați meniul.

Funcția caută apelul către meniul de navigare, apoi găsește oriunde aveți un rel="fancybox" și îl înlocuiește cu un rel="fancybox" class="fancybox". Puteți înlocui fancybox cu orice clasă aveți nevoie să adăugați la elementele de meniu. Gata și rezolvat!

14 dec. 2011 23:47:22
Comentarii

Postare excelentă!! Doar un lucru de notat. Codul nu va funcționa dacă cineva adaugă un titlu. Am întâlnit aceeași problemă... Așa că am eliminat tag-ul A de la începutul ambelor valori de înlocuire. Lăsându-mă cu ceva de genul acesta... return preg_replace('/rel="fancybox"/', 'class="fancybox"', $ulclass, -1); Codul funcționează perfect!

User User
29 mar. 2013 15:59:52
1

Răspunsurile actuale nu par să recunoască faptul că întrebarea este cum să adaugi o clasă elementului a și nu elementului li, sau sunt prea complicate. Iată o abordare simplă folosind filtrul nav_menu_link_attributes care îți permite să țintești un meniu specific bazat pe slug-ul său și un link specific din acel meniu bazat pe ID-ul său. Poți folosi var_dump pe $args și $item pentru a obține mai multe modalități de a-ți crea condiția.

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 == 'your-menu-slug' && $item->ID == 1){

        $class = "button";

        // Asigură-te că nu suprascrii clasele existente
        $atts['class'] = (!empty($atts['class'])) ? $atts['class'].' '.$class : $class; 
    }

    return $atts;
}
6 mar. 2016 22:17:16
Comentarii

mulțumesc mult, am schimbat if în if ($args->theme_location == 'footer-menu' ) pentru a selecta meniul după locația sa, și tot funcționează perfect

efirvida efirvida
20 apr. 2018 21:48:36
0

Știu că acest lucru a fost răspuns cu mult timp în urmă, dar doar ca informație generală, am descoperit cum să adaug o clasă fiecărui element de meniu individual folosind opțiunea "Screen" din pagina de administrare WordPress pentru Meniuri Personalizate.

21 nov. 2011 22:49:13
0

A trebuit să fac ceva similar recent și am descoperit o altă metodă. A trebuit să adaug o clasă similară pentru un plugin Nivo lightbox. Așa că am adăugat "nivo" la atributul rel ("Link Relationship (XFN)") și apoi următorul cod pe filtrul nav_menu_link_attributes.

function add_nivo_menuclass($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','add_nivo_menuclass', 0,3);
8 ian. 2015 03:28:56
0

În partea superioară a paginii Apariție -> Meniuri, faceți clic pentru a extinde Opțiuni Ecran, bifați caseta de selectare Clase CSS. Acum, când extindeți fiecare element de meniu adăugat, veți vedea un câmp Clase CSS (opțional).

21 dec. 2018 18:28:11