Добавление класса к активному элементу и его родителю в меню навигации
Я использую следующий код для добавления названия класса "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" как к текущей ссылке, так и к её родителю?
В зависимости от контекста, в котором вам это нужно, и исходя из вашего кода, вы можете попробовать это:
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;
}

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

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

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