Вопрос или проблема
Я собираюсь добавить атрибут данных к элементу списка в меню. Я вижу, что некоторые темы здесь могут добавить его к тегу <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). Вот подробное руководство по осуществлению данного процесса.
Пошаговое руководство по созданию пользовательского класса-проводника
-
Создание класса-проводника
В вашем файле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); } }
-
Инициация используемого класса-проводника
В месте, где вы вызываете меню, необходимо указать ваш новый класс-проводник: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, не стесняйтесь задавать их.