Adaugă clasa pentru elementul activ și părintele său în meniul de navigare

5 sept. 2013, 00:26:51
Vizualizări: 22.9K
Voturi: 2

Folosesc următorul cod pentru a adăuga clasa "active" elementului curent din meniu:

add_filter('nav_menu_css_class', 'add_active_class', 10, 2 );

function add_active_class($classes, $item) {
  if( $item->menu_item_parent == 0 && in_array('current-menu-item', $classes) ) {
    $classes[] = "active";
  }

  return $classes;
}

Acest cod funcționează perfect, dar doar pentru elementele fără submeniu dropdown. Dacă există un element cu elemente copil, nu va adăuga clasa active elementului părinte.

Există vreo modalitate prin care pot modifica acest cod astfel încât filtrul să adauge clasa "active" atât linkului curent cât și părintelui său?

4
Comentarii

Nu trebuie să faci asta... WP deja adaugă clase pentru asta precum current-menu-item sau current-ancestor-item... etc...

User User
5 sept. 2013 00:38:51

Salut @splashingpixels, știu că Wordpress adaugă propriile clase personalizate, dar am nevoie în mod specific să adaug o clasă numită "active".

Johann Johann
5 sept. 2013 00:44:01

Pot să întreb de ce trebuie să fie exact cuvântul active?

User User
5 sept. 2013 00:45:30

Mulțumesc pentru răspunsul rapid. Dezvolt o temă folosind Bootstrap ca bază și stilurile de bază ale Bootstrap. Denumirile claselor diferă de cele din WordPress și aș dori să construiesc un filtru înainte de a modifica stilurile de bază.

Johann Johann
5 sept. 2013 01:00:23
Toate răspunsurile la întrebare 1
5

În funcție de contextul în care aveți nevoie de acest lucru și pornind de la codul pe care îl aveți, puteți încerca următoarele:

add_filter('nav_menu_css_class', 'add_active_class', 10, 2 );

function add_active_class($classes, $item) {
  $class_names = array( 'current-menu-item', 'current-menu-ancestor', 'current-menu-parent', 'current_page_parent',  'current_page_ancestor' );

  if( $item->menu_item_parent == 0 && in_array( $class_names, $classes) ) {
    $classes[] = "active";
  }

  return $classes;
}

ACTUALIZARE: dacă codul de mai sus nu funcționează din cauza utilizării array-ului ca parametru pentru funcția in_array datorită versiunii PHP, încercați următorul cod:

add_filter('nav_menu_css_class', 'add_active_class', 10, 2 );

function add_active_class($classes, $item) {

  if( $item->menu_item_parent == 0 && 
    in_array( 'current-menu-item', $classes ) ||
    in_array( 'current-menu-ancestor', $classes ) ||
    in_array( 'current-menu-parent', $classes ) ||
    in_array( 'current_page_parent', $classes ) ||
    in_array( 'current_page_ancestor', $classes )
    ) {

    $classes[] = "active";
  }

  return $classes;
}

Dacă doriți ca orice element curent să aibă clasa active, puteți face astfel:

add_filter('nav_menu_css_class', 'add_active_class', 10, 2 );

function add_active_class($classes, $item) {

  if( in_array( 'current-menu-item', $classes ) ||
    in_array( 'current-menu-ancestor', $classes ) ||
    in_array( 'current-menu-parent', $classes ) ||
    in_array( 'current_page_parent', $classes ) ||
    in_array( 'current_page_ancestor', $classes )
    ) {

    $classes[] = "active";
  }

  return $classes;
}
5 sept. 2013 00:51:08
Comentarii

Salut @splashingpixels. Am încercat codul tău, dar nu pare să funcționeze. Am verificat codul sursă și clasa "active" nu este adăugată.

Johann Johann
5 sept. 2013 01:01:15

Am actualizat răspunsul, încearcă acum..

User User
5 sept. 2013 01:07:49

Mulțumesc @splashingpixels, ești genial! Cod impecabil. Doar încă o întrebare, nu știu dacă e posibil sau dacă e o restricție Wordpress. Cu acest cod, acum toate elementele părinte au clasa "active" când e necesar. Există vreo modalitate ca atunci când dau click pe un element din dropdown, să adauge și acolo clasa "active"? Astfel încât clasa "active" să fie adăugată atât la părinte cât și la copil?

Johann Johann
5 sept. 2013 01:13:05

Da, poți, vezi răspunsul actualizat...și te rog să îl marchezi ca răspuns dacă a funcționat pentru tine...mulțumesc.

User User
5 sept. 2013 01:24:58

Ești cel mai bun, această problemă este rezolvată!

Johann Johann
5 sept. 2013 01:28:56