Поддержка Проблемы и решения Заменить li в wp_nav_menu

  • Друзяки! Расскажите — как заменить li в меню. Например на div. Колдовать с обёрткой ul я умею вплоть до её аннигиляции, а li ну ваще не меняются.

    А то никак не могу победить процентное отличие li от div при вёрстке горизонтального расположения пунктов меню. Блоки спокойно относятся к процентам и четыре блока по 25% легко уживаются в ста процентах, а пункты списка почему-то прибавляют лишнего и приходится умничать, задавая им какую-то дичь типа 24.7%.

Просмотр 12 ответов — с 1 по 12 (всего 12)
  • Ну вот. Чего бы я без друзяк делал? Спасибо! Это при том, что Стэк я тоже перемолотил, но очевидно — не тем пальцем.

    А для добавления стилей к каждому из внутренних блоков, можно использовать какой-нибудь аргумент или только через админку, включив «CSS» в Настройках Экрана?

    Модератор Denis Yanchevskiy

    (@denisco)

    WordPress-разработчик, wpcute.ru

    add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2);
    
    function special_nav_class($classes, $item){
        $classes[] = 'your-custom-class';
        return $classes;
    }

    http://www.wpbeginner.com/wp-tutorials/add-a-custom-class-in-wordpress-menu-item-using-conditional-statements/

    Ура. Снова спасибо! Когда не догадываешься о существовании возможности, не знаешь — где и рыть.

    Друзяки, настиг ужас. Смотрите какая штука вылезла: с применением фильтра, который порекомендовал Denis Yanchevskiy, новый класс «your-custom-class» залез во внутренние пункты остальных меню. При этом им оказалось всё равно — «div» они или «li». Как бы конкретизировать данный фильтр только для того или иного меню? (а то у меня их три и я ещё не разогнался)

    А так-то всё работает, осталась лишь эта малость.

    Модератор Denis Yanchevskiy

    (@denisco)

    WordPress-разработчик, wpcute.ru

    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», и вводил два знака «=» вместо трёх, но результата не добился. Что я опять поломал?

    Модератор Denis Yanchevskiy

    (@denisco)

    WordPress-разработчик, wpcute.ru

    Указывать «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 );

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    В 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 ) );
    

    Круто Сергей, спасибо! Дебагер больше не ругается, но класс во внутренние блоки не добавился. Я не помню почему, но была стойкая уверенность в каком-то неверном указании фильтру на то меню, где это нужно сделать. Потому что в остальном всё работает. Ну то есть, если меню не конкретизировать, то класс прекрасно в эти блоки встраивается. Только сразу во все меню.

Просмотр 12 ответов — с 1 по 12 (всего 12)