Добавление класса к активному элементу и его родителю в меню навигации

5 сент. 2013 г., 00:26:51
Просмотры: 22.9K
Голосов: 2

Я использую следующий код для добавления названия класса "active" к текущему пункту меню:

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

Это работает отлично, но только для пунктов без выпадающего меню. Если у пункта есть дочерние элементы, то класс active не добавляется к родительскому пункту.

Есть ли способ изменить этот код так, чтобы фильтр добавлял класс "active" как к текущей ссылке, так и к её родителю?

4
Комментарии

Вам не нужно этого делать... WordPress уже добавляет классы для этого, такие как current-menu-item или current-ancestor-item... и т.д...

User User
5 сент. 2013 г. 00:38:51

Привет @splashingpixels, я знаю, что WordPress добавляет свои собственные классы, но мне конкретно нужно добавить класс с именем "active".

Johann Johann
5 сент. 2013 г. 00:44:01

Можно спросить, почему именно слово active?

User User
5 сент. 2013 г. 00:45:30

Спасибо за быстрый ответ. Я разрабатываю тему на основе Bootstrap и его базовых стилей. Наименование классов отличается от WordPress, и я хотел бы создать фильтр перед изменением основных стилей.

Johann Johann
5 сент. 2013 г. 01:00:23
Все ответы на вопрос 1
5

В зависимости от контекста, в котором вам это нужно, и исходя из вашего кода, вы можете попробовать это:

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

ОБНОВЛЕНИЕ: если вышеуказанный код не работает из-за использования массива в качестве иглы для функции in_array в вашей версии PHP, попробуйте этот вариант:

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

Если вы хотите, чтобы любой текущий элемент получал класс active, используйте этот код:

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 сент. 2013 г. 00:51:08
Комментарии

Привет @splashingpixels. Я попробовал ваш код, но он, кажется, не работает. Я проверил исходный код, и класс "active" не добавляется.

Johann Johann
5 сент. 2013 г. 01:01:15

Я обновил ответ, попробуйте это..

User User
5 сент. 2013 г. 01:07:49

Спасибо @splashingpixels, ты лучший! Безупречный код. Только еще один вопрос, я не знаю, возможно ли это или это ограничение Wordpress. С этим кодом теперь все родительские элементы получают класс "active", когда это необходимо. Есть ли способ, чтобы при клике на элемент выпадающего списка тоже добавлялся класс "active"? То есть чтобы класс "active" добавлялся и к родителю, и к дочернему элементу?

Johann Johann
5 сент. 2013 г. 01:13:05

Да, вы можете, см. обновленный ответ... и пожалуйста, отметьте его как решение, если оно сработало для вас... спасибо.

User User
5 сент. 2013 г. 01:24:58

Ты лучший, эта проблема решена!

Johann Johann
5 сент. 2013 г. 01:28:56