Добавьте атрибут данных к элементу списка в меню.

Вопрос или проблема

Я собираюсь добавить атрибут данных к элементу списка в меню. Я вижу, что некоторые темы здесь могут добавить его к тегу <a>, но я хочу добавить его к самому элементу списка <li>.

Этот код добавляет атрибут к тегу <a>.

add_filter( 'nav_menu_link_attributes', 'themeprefix_menu_attribute_add', 10, 3 );
function themeprefix_menu_attribute_add( $atts, $item, $args ) {
  // Установить ID меню
  $menu_link1 = 20;

// Условно сопоставить ID и добавить атрибут и значение
if ($item->ID == $menu_link1) {
$atts['data-content'] = 'about';

//Вернуть новый атрибут
return $atts;

Есть идеи, как добавить атрибут к <li> без использования jQuery?

Попробуйте этот код в вашем файле функций.

function add_class_to_nav_items($nav_items, $args) {
  if ( $args['theme_location'] == 'MY_NAV_THEME_LOCATION' ) { // ВАЖНО: замените MY_NAV_THEME_LOCATION на местоположение вашего меню
    foreach ($nav_items as &$nav_item) {
      $nav_item->classes[] = 'custon-class-name';
    }
  }

  return $nav_items;

}

add_filter( 'wp_nav_menu_objects', 'add_class_to_nav_items', 11 );

Нет доступного фильтра для добавления пользовательского атрибута к элементу li. Единственный возможный способ — использовать пользовательского обработчика.

Вот как это сделать: (файл functions.php или пользовательский плагин)

class so244415_custom_walker extends Walker_Nav_Menu {
    public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
        //ваш код здесь. строка, которую вы хотите отредактировать, это:
        //$output .= $indent . '<li' . $id . $class_names .'>';
    }
}

Ищите файл class-walker-nav-menu.php в wp-includes и скопируйте всё из определенной функции start_el туда и отредактируйте его по своим потребностям.

Вы можете вызвать своё меню так: (в файле темы, где вы вызываете своё меню)

wp_nav_menu( array(
    'walker' => new so244415_custom_walker( $args ), /*( $args ) необязательно...*/ 
));

Другим вариантом было бы использовать

function so244415_walker_nav_menu_start_el($item_output, $item, $depth, $args) {
    //некоторый regex/str_replace здесь
    return $item_output;
}
add_filter( 'walker_nav_menu_start_el', 'so244415_walker_nav_menu_start_el', 10, 4);    

Но я не являюсь большим поклонником этого решения, так как regex и подобное не являются лучшим способом редактирования html.

Ответ или решение

Для добавления пользовательского атрибута к элементу списка (<li>) в меню WordPress, необходимо использовать механизм, который обходится без JavaScript. В WordPress не существует встроенного фильтра, который позволяет напрямую добавлять атрибуты к элементам списка навигационного меню. Однако, вы можете реализовать это, используя пользовательский класс-проводник (custom walker). Вот подробное руководство по осуществлению данного процесса.

Пошаговое руководство по созданию пользовательского класса-проводника

  1. Создание класса-проводника
    В вашем файле functions.php темы добавьте следующий код:

    class Custom_Walker_Nav_Menu extends Walker_Nav_Menu {
       public function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0) {
           $indent = ($depth) ? str_repeat("\t", $depth) : '';
    
           // Получение классов элемента. Убедитесь, что элемент имеет корректные классы.
           $classes = empty($item->classes) ? array() : (array) $item->classes;
           $classes[] = 'menu-item'; // Добавляем класс menu-item
    
           // Условие для проверки ID элемента и добавления пользовательского атрибута
           $custom_attr = '';
           if ($item->ID == 20) { // Замените 20 на ID вашего элемента
               $custom_attr = ' data-content="about"'; // Добавление кастомного атрибута
           }
    
           // Преобразование классов в строку
           $class_names = join(' ', apply_filters('nav_menu_css_class', array_filter($classes), $item, $args));
           $class_names = $class_names ? ' class="' . esc_attr($class_names) . '"' : '';
    
           // Начало элемента списка
           $output .= $indent . '<li' . $class_names . $custom_attr . '>';
           $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_url($item->url) . '"' : '';
    
           // Формирование HTML для ссылки
           $item_output = $args->before;
           $item_output .= '<a' . $attributes . '>';
           $item_output .= $args->link_before . apply_filters('the_title', $item->title, $item->ID) . $args->link_after;
           $item_output .= '</a>';
           $item_output .= $args->after;
    
           $output .= apply_filters('walker_nav_menu_start_el', $item_output, $item, $depth, $args);
       }
    }
  2. Инициация используемого класса-проводника
    В месте, где вы вызываете меню, необходимо указать ваш новый класс-проводник:

    wp_nav_menu(array(
       'theme_location' => 'YOUR_MENU_LOCATION', // Замените на реальный location вашего меню
       'walker' => new Custom_Walker_Nav_Menu(),
    ));

Пояснение кода

  • Класс Custom_Walker_Nav_Menu: Это пользовательская реализация стандартного класса Walker_Nav_Menu. В методе start_el мы добавляем условие для проверки ID элемента, чтобы добавить к нему пользовательский дата-атрибут.
  • Пользовательский атрибут: В примере атрибут data-content добавляется элементу списка с ID 20. Вы можете изменить его на любой другой ID, который вам нужен.
  • Вывод элементов: Мы формируем HTML-код для элемента списка, добавляя необходимые атрибуты.

Заключение

Использование пользовательского класса-проводника является наиболее эффективным способом расширения функциональности меню в WordPress, когда необходимо внесение изменений в структуру HTML. Хотя данный подход требует больше усилий по сравнению с простыми фильтрами, он предоставляет гибкость в управлении атрибутами и классами.

Если у вас есть дополнительные вопросы по данному процессу или по другим аспектам работы с WordPress, не стесняйтесь задавать их.

Оцените материал
Добавить комментарий

Капча загружается...