Заменить li в wp_nav_menu
-
Друзяки! Расскажите — как заменить li в меню. Например на div. Колдовать с обёрткой ul я умею вплоть до её аннигиляции, а li ну ваще не меняются.
А то никак не могу победить процентное отличие li от div при вёрстке горизонтального расположения пунктов меню. Блоки спокойно относятся к процентам и четыре блока по 25% легко уживаются в ста процентах, а пункты списка почему-то прибавляют лишнего и приходится умничать, задавая им какую-то дичь типа 24.7%.
-
Ну вот. Чего бы я без друзяк делал? Спасибо! Это при том, что Стэк я тоже перемолотил, но очевидно — не тем пальцем.
А для добавления стилей к каждому из внутренних блоков, можно использовать какой-нибудь аргумент или только через админку, включив «CSS» в Настройках Экрана?
add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2); function special_nav_class($classes, $item){ $classes[] = 'your-custom-class'; return $classes; }
Ура. Снова спасибо! Когда не догадываешься о существовании возможности, не знаешь — где и рыть.
Друзяки, настиг ужас. Смотрите какая штука вылезла: с применением фильтра, который порекомендовал Denis Yanchevskiy, новый класс «your-custom-class» залез во внутренние пункты остальных меню. При этом им оказалось всё равно — «div» они или «li». Как бы конкретизировать данный фильтр только для того или иного меню? (а то у меня их три и я ещё не разогнался)
А так-то всё работает, осталась лишь эта малость.
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; }
Что-то не выходит добиться от фильтра назначения класса в определённое меню. Я правильно понимаю, что вместо «primary-menu» нужно вписать имя моего меню, а вместо «btn» имя моего класса? И верно ли равенство со знаком из трёх «=»?
Если что, в functions.php мои меню зарегистрированы так:
register_nav_menus( array( 'menu-1' => esc_html__( 'Primary', 'bubel' ), 'footer-menu' => esc_html__( 'Secondary', 'bubel' ), 'action-menu' => esc_html__( 'action', 'bubel' ), ) );
В фильтре я указывал «action» и «action-menu», и вводил два знака «=» вместо трёх, но результата не добился. Что я опять поломал?
Указывать «action-menu», btn заменить на свой класс да.
add_filter( 'nav_menu_css_class', 'special_nav_class', 10, 3 );
10, 2 на 10, 3 заменили?Сделал всё именно так, но снова — в классах блоков ничего не появляется. Присутствует только такое:
<div id="menu-item-183" class="некий_класс_прописанный_в_меню_админки menu-item menu-item-type-post_type menu-item-object-page"><a title="Заголовок" href="https://мойсайт.ру/">Имя пункта меню</a></div>
А в functions.php, у меня Walker, подсказанный Flector и Ваш фильтр. На всякий случай, сейчас он выглядит так:
add_filter( 'nav_menu_css_class', 'special_nav_class', 10, 3 ); function special_nav_class( $classes, $item, $args ) { if ( 'action-menu' === $args->theme_location ) { $classes[] = ' column fourth'; } return $classes; }
Вот этого «column fourth» я и ожидаю среди классов внутренних блоков меню «action-menu». Пока добился его появления лишь прописав в поле «CSS» пунктов меню админки. А хотелось бы всё запихнуть в functions.php, чтобы в одной корзине все яйца лежали, простигосподи.
А дебагер вот чего написал:
Warning: Declaration of Description_Walker::start_el(&$output, $item, $depth, $args) should be compatible with Walker_Nav_Menu::start_el(&$output, $item, $depth = 0, $args = Array, $id = 0) in /wp-content/themes/bubel/functions.php on line 82
А ещё вот это:
Warning: Missing argument 3 for special_nav_class(), called in /wp-includes/class-wp-hook.php on line 298 and defined in /wp-content/themes/bubel/functions.php on line 168
298 строка файла «class-wp-hook.php» выглядит так:
$value = call_user_func_array( $the_['function'], $args );
В
Description_Walker
нужно заменить:function start_el(&$output, $item, $depth, $args)
на:
function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 )
А эту строку:
$class_names = join(' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
на эту:
$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) );
Круто Сергей, спасибо! Дебагер больше не ругается, но класс во внутренние блоки не добавился. Я не помню почему, но была стойкая уверенность в каком-то неверном указании фильтру на то меню, где это нужно сделать. Потому что в остальном всё работает. Ну то есть, если меню не конкретизировать, то класс прекрасно в эти блоки встраивается. Только сразу во все меню.
- Тема «Заменить li в wp_nav_menu» закрыта для новых ответов.