Удаление классов и id из элементов li в wp_nav_menu
Я новичок в WordPress и пытаюсь разобраться с созданием темы. Сейчас я использую wp_nav_menu для генерации моего меню. Моё меню состоит из страниц и категорий.
Однако, меню по умолчанию генерируется следующим образом:
<div id="navi">
<div class="menu-primary-container">
<ul id="menu-primary" class="menu">
<li id="menu-item-14" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-14"></li>
<li id="menu-item-16" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-16"></li>
<li id="menu-item-20" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-20"></li>
<li id="menu-item-15" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-15"></li>
<li id="menu-item-17" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-17"></li>
</ul>
</div>
</div>
Я хочу удалить все классы и id из элементов li и ul. Я уже некоторое время ищу решение в Google. Пробовал разные методы, но безуспешно. Буду благодарен за любую помощь. В настоящее время я использую WordPress 3.1
Заранее спасибо!

Вы можете изменить id и class каждого элемента меню с помощью фильтров nav_menu_item_id
и nav_menu_css_class
следующим образом:
add_filter('nav_menu_item_id', 'clear_nav_menu_item_id', 10, 3);
function clear_nav_menu_item_id($id, $item, $args) {
return "";
}
add_filter('nav_menu_css_class', 'clear_nav_menu_item_class', 10, 3);
function clear_nav_menu_item_class($classes, $item, $args) {
return array();
}
В результате элементы будут выглядеть как <li id="" class="">
. Этот же механизм можно использовать для установки полезных ID, например, слага страницы.

Если посмотреть в функцию wp_nav_menu()
, можно увидеть, что элементы меню формируются с помощью walk_nav_menu_tree()
, которая вызывает Walker_Nav_Menu
для выполнения работы (если только вы не указали свой собственный класс-обходчик). Этот класс содержит метод start_el()
, вызываемый для каждого пункта меню. В этой функции видно, что классы фильтруются через хук nav_menu_css_class
, а идентификатор — через nav_menu_item_id
. Таким образом, если подключить свой код к этим хукам, можно изменить их на что угодно.
Подменю всегда оборачиваются в <ul class="sub-menu">
, а основную обёртку можно изменить с помощью аргументов menu_id
и menu_class
.

/**
* Удаляет атрибуты id и class из HTML-кода меню WordPress
*
* @param string $menu HTML-код меню
* @return string Очищенный HTML-код меню без атрибутов id и class
*/
function wp_nav_menu_remove_attributes( $menu ){
return $menu = preg_replace('/ id=\"(.*)\" class=\"(.*)\"/iU', '', $menu );
}
// Добавляем фильтр для обработки вывода меню
add_filter( 'wp_nav_menu', 'wp_nav_menu_remove_attributes' );

Это решение было опубликовано на wp3layout. Вам нужно добавить этот код в файл function.php вашей темы.
function remove_css_id_filter($var) {
return is_array($var) ? array_intersect($var, array('current-menu-item')) : '';
}
add_filter( 'page_css_class', 'remove_css_id_filter', 100, 1);
add_filter( 'nav_menu_item_id', 'remove_css_id_filter', 100, 1);
add_filter( 'nav_menu_css_class', 'remove_css_id_filter', 100, 1);
Надеюсь, это поможет.

Я считаю, что следует оставить классы menu-item-has-children и current-menu-item для стилизации
вставьте следующий код в ваш functions.php
//удаляем ненужные CSS-классы для каждого элемента li
function remove_css_from_menu($var)
{
return is_array($var) ? array_intersect($var, array('current-menu-item', 'menu-item-has-children',)) : '';
}
add_filter('nav_menu_css_class', 'remove_css_from_menu', 100, 1);
//удаляем ID для каждого элемента li
add_filter('nav_menu_item_id', '__return_false');
