Добавить класс к пунктам меню для одного конкретного меню (nav_menu_css_class)

13 мар. 2013 г., 11:21:56
Просмотры: 19.7K
Голосов: 6

Этот код добавляет дополнительный класс ко всем пунктам моего меню:

add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2);
function special_nav_class($classes, $item){
  $classes[] = 'btn'; // Добавляем класс 'btn' к каждому пункту меню
  return $classes;
}

Как ограничить действие этого фильтра только главным меню (с расположением 'primary-menu')?

С уважением,

Даниэль

0
Все ответы на вопрос 4
1
16

Я также пытался решить эту проблему и в процессе поиска решения обнаружил, что фильтр nav_menu_css_class на самом деле принимает третий параметр. Это объект, содержащий переменные, связанные с вашим меню, включая переменную theme_location, которую вы можете использовать для условного применения классов к конкретному меню. Вам просто нужно убедиться, что вы установили theme_location при вызове wp_nav_menu в вашей теме.
Вот пример:

add_filter( 'nav_menu_css_class', 'special_nav_class', 10, 3 );
function special_nav_class( $classes, $item, $args ) {
    if ( 'primary-menu' === $args->theme_location ) {
        $classes[] = 'btn';
    }

    return $classes;
}
2 мар. 2015 г. 02:21:12
Комментарии

в моем случае я вызвал меню через wp_nav_menu( ['menu' => 'main'] );, поэтому $args->theme_location был пустым. но $args->name не был пустым (поскольку я только это установил..), поэтому я использовал этот атрибут, и это сработало..

honk31 honk31
23 февр. 2017 г. 18:39:36
0

Я наткнулся на эту тему, пытаясь решить такую же проблему - вот что у меня получилось. Я не знаю, насколько хорошо это работает, поскольку функция будет вызываться для каждого пункта меню, но, похоже, меню в WordPress организованы как таксономии, и поэтому можно использовать функцию has_term(), чтобы определить, находится ли пункт в определённом меню, и get_nav_menu_locations(), чтобы получить список меню и их расположений в теме.

Модифицируя ваш код:

add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2);
function special_nav_class($classes, $item){
    $menu_locations = get_nav_menu_locations();
    if ( has_term($menu_locations['primary-menu'], 'nav_menu', $item) ) {
        $classes[] = 'btn';
    }
    return $classes;
}
30 апр. 2013 г. 01:07:01
1

Вам не нужно изменять файл functions.php. Просто перейдите в файл шаблона, найдите wp_nav_menu и добавьте параметр 'menu_class'.

<?php wp_nav_menu( array( 'theme_location' => 'primary','menu_class' => 'newmenuclass' ) ); ?>
13 мар. 2013 г. 11:46:20
Комментарии

Спасибо за ответ, но мне нужен класс для элементов меню (li), а не для всего меню (ul).

Daniel Baars Daniel Baars
13 мар. 2013 г. 18:07:49
0

Добавьте это в файл function.php, и все будет работать

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


function special_nav_class ($classes, $item) {

    $classes[] = 'nav__link';

    if (in_array('current-menu-item', $classes) ){

        $classes[] = 'nav__link-active';

    }

    return $classes;
}
9 нояб. 2017 г. 10:14:28