Добавить класс к определенной ссылке в пользовательском меню


10

Я знаю, что вы можете добавить класс в пользовательских опциях меню, но он добавляет его в LI до A. Я хочу применить класс непосредственно к этой конкретной A, а не ко всей LI.

Таким образом, вместо вывода

<li id="menu-item-51" class="NEWCLASS menu-item menu-item-type-custom menu-item-51"><a href="#">Link</a> </li>

Я тоже хочу, чтобы это было так.

<li id="menu-item-51" class="menu-item menu-item-type-custom menu-item-51"><a href="#" class="NEWCLASS">Link</a></li>

Есть идеи?


Просто чтобы прояснить, что вы подразумеваете под добавлением класса? Какие параметры вы точно нажимаете в панели администратора?
Wordpressor

2
Какой в ​​этом смысл? Просто измените свой селектор с .classна .class a?
Wyrfel

1
Да, я тоже не понимаю, просто установите свой CSS, чтобы нацелить ссылку на основе содержащего <li>элемента. Если у вас есть подменю под этим конкретным элементом, это не проблема, вы можете решить это в CSS (я могу привести примеры, если это необходимо).
t31os

+1 за ваш комментарий @wyrfel ... @ Picard102 взгляните на специфику CSS. это также объяснит вам, как правильно настроить таргетинг HTML-элементов через CSS.
Кайзер

Ответы:


11

Вы можете использовать nav_menu_css_classфильтр

add_filter('nav_menu_css_class' , 'my_nav_special_class' , 10 , 2);
function my_nav_special_class($classes, $item){
    if(your condition){ //example: you can check value of $item to decide something...
        $classes[] = 'my_class';
    }
    return $classes;
}

Используя этот $ item, вы можете выполнить любое условие. и это добавит класс к определенному li, и вы можете стилизовать тег на основе этого следующим образом:

.my_class a{
   background-color: #FFFFFF;
}

Я пытаюсь добавить класс для элементов с определенным шаблоном страницы, но не могу приступить get_page_template_slugк работе. Есть идеи?
Билл

4

Я нашел решение на этом сайте с помощью пользовательского ходунка .

Два шага: замените код wp_nav_menu по умолчанию на отредактированный, а затем добавьте код в functions.php темы.

Сначала замените wp_nav_code по умолчанию следующим (код скопирован с сайта выше):

    wp_nav_menu( array(
     'menu' => 'Main Menu',
     'container' => false,
     'menu_class' => 'nav',
     'echo' => true,
     'before' => '',
     'after' => '',
     'link_before' => '',
     'link_after' => '',
     'depth' => 0,
     'walker' => new description_walker())
     );

Затем добавьте следующий код в functions.php. Делая это, вы можете добавить класс к ссылкам меню:

class description_walker extends Walker_Nav_Menu
{

  function start_el(&$output, $item, $depth, $args)
  {
       global $wp_query;
       $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

       $class_names = $value = '';

       $classes = empty( $item->classes ) ? array() : (array) $item->classes;

       $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
       $class_names = ' class="'. esc_attr( $class_names ) . '"';

       $output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $class_names .'>';

       $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';
       $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';
       $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';
       $attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';

       $prepend = '<strong>';
       $append = '</strong>';
       $description  = ! empty( $item->description ) ? '<span>'.esc_attr( $item->description ).'</span>' : '';

       if($depth != 0)
       {
                 $description = $append = $prepend = "";
       }

        $item_output = $args->before;
        $item_output .= '<a'. $attributes .'>';
        $item_output .= $args->link_before .$prepend.apply_filters( 'the_title', $item->title, $item->ID ).$append;
        $item_output .= $description.$args->link_after;
        $item_output .= '</a>';
        $item_output .= $args->after;

        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );

                    if ($item->menu_order == 1) {
            $classes[] = 'first';
        }

        }
}

В конце кода есть несколько строк, начинающихся с $ item_output. В частности, вы хотите посмотреть на этот кусок:

$item_output .= '<a'. $attributes .'>';

Потому что эта строка определяет вывод для начала ссылки html. Если вы измените его на что-то вроде этого:

$item_output .= '<a'. $attributes . 'class="abc"' .'>';

Тогда все ваши ссылки в меню будут добавлены class = "abc".


Тем не менее, он не позволяет использовать собственный класс для каждой ссылки (или, по крайней мере, я не знаю, как его кодировать). Это проблема для меня.

Для тех, кто спрашивает, почему вы хотите это сделать? Я хочу, чтобы мои ссылки в меню открывали лайтбоксы (если быть точнее, в цветных коробках), и для этого им нужны классы в ссылках. Например:

<a class="lightbox1" href="#">Photo</a>

Возможно ли способ динамически генерировать классы, такие как «lightbox1» для первой ссылки, «lightbox2» для второй ссылки и т. Д.?


@Rainman Ваш ответ немного помог мне, и вы задали хороший вопрос. Я уверен, что вы нашли лучшее решение, но для тех, у кого его нет, я использовал модифицированную версию решения, найденную здесь: wpbeginner.com/wp-themes/…
NW Tech

3

РЕШИТЬ !!!! Мне нужно было понять это, чтобы сделать ссылку на пункт меню для встроенного HTML в fancybox. Вставьте следующий код в файл theme.php:

function add_menuclass($ulclass) {
    return preg_replace('/<a rel="fancybox"/', '<a class="fancybox"', $ulclass, -1);
}
add_filter('wp_nav_menu','add_menuclass');

Затем ... на вкладке «Меню» панели инструментов WP создайте пользовательскую ссылку и добавьте ее в свое меню. Вверху, где написано Параметры экрана, убедитесь, что у вас установлен флажок «Связь с ссылками (XFN)». Это добавит это поле в ваш пользовательский пункт меню. Введите «fancybox» (без кавычек) в поле и сохраните свое меню.

Функция ищет вызов в меню навигации, затем находит, где бы вы ни находились, rel="fancybox"и заменяет его на rel="fancybox" class="fancybox". Вы можете заменить fancybox любым классом, который вам нужно добавить в пункты меню. Готово и сделано!


Великий пост !! Только одна вещь, чтобы отметить. Код не будет работать, если кто-то добавит заголовок. Я столкнулся с той же проблемой ... Так что я просто удалил тег A в начале обоих значений замены. Оставив меня с чем-то вроде этого ... return preg_replace ('/ rel = "fancybox" /', 'class = "fancybox"', $ ulclass, -1); Код работает отлично!

1

Текущие ответы, кажется, не признают, что вопрос в том, как добавить класс к aэлементу, а не к liэлементу, или слишком сложен. Вот простой подход с использованием nav_menu_link_attributesфильтра, который позволяет настроить таргетинг на определенное меню, основанное на его фрагменте, и на конкретную ссылку на страницу в этом меню, основанную на его идентификаторе. Вы можете использовать var_dump $ args и $ item, чтобы получить больше способов создать ваше условие.

add_filter('nav_menu_link_attributes', 'custom_nav_menu_link_attributes', 10, 4);

function custom_nav_menu_link_attributes($atts, $item, $args, $depth){
    if ($args->menu->slug == 'your-menu-slug' && $item->ID == 1){

        $class = "button";

        // Make sure not to overwrite any existing classes
        $atts['class'] = (!empty($atts['class'])) ? $atts['class'].' '.$class : $class; 
    }

    return $atts;
}

Большое спасибо, я изменил ifего, чтобы if ($args->theme_location == 'footer-menu' )посмотреть меню по его местоположению, и все прекрасно работает
efirvida

0

Я знаю, что на этот вопрос давным-давно ответили, но, как общая информация, я нашел, как добавить класс для каждого пункта меню индивидуально, используя опцию «Экран» на странице администратора WordPress для пользовательских меню.


0

Мне пришлось сделать что-то похожее недавно и придумать другой способ. Мне пришлось добавить аналогичный класс для плагина Nivo Lightbox. Поэтому я добавил «nivo» к атрибуту rel («Link Relationship (XFN)»), а затем к nav_menu_link_attributesфильтру следующее.

function add_nivo_menuclass($atts, $item, $args) {
    if( is_array($atts) && !empty($atts['rel']) && $atts['rel'] = 'nivo' ) {
        $atts['class'] = 'lightbox';
        $atts['data-lightbox-type'] = 'inline';
    }

    return $atts;

    }
add_filter('nav_menu_link_attributes','add_nivo_menuclass', 0,3);

0

В верхней части Appearance -> Menusстраницы нажмите, чтобы развернуть Screen Options, установите флажок CSS Classes. Теперь, когда вы развернете каждый из добавленных пунктов меню, вы увидите CSS Classes (optional)поле.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.