Удаление классов и id из элементов li в wp_nav_menu

23 мар. 2011 г., 06:44:28
Просмотры: 36.5K
Голосов: 6

Я новичок в 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

Заранее спасибо!

1
Комментарии

Используйте плагин Falcon — в нём есть функция для очистки ID и классов пунктов меню, которая оставляет только необходимые (например, current-menu-item).

Anh Tran Anh Tran
1 авг. 2023 г. 10:08:59
Все ответы на вопрос 5
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, например, слага страницы.

27 апр. 2011 г. 12:35:08
Комментарии

Всегда лучше использовать основные возвратные функции WordPress. Поэтому в данном случае используйте: add_filter( 'nav_menu_item_id', '__return_null', 10, 3 ); или add_filter( 'nav_menu_css_class', '__return_empty_array', 10, 3 );

WPExplorer WPExplorer
8 мар. 2018 г. 00:17:18
0

Если посмотреть в функцию 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.

23 мар. 2011 г. 15:53:56
2
/**
 * Удаляет атрибуты 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' );
23 мар. 2011 г. 07:14:50
Комментарии

Это помешает мне добавить класс "active" для активной навигации?

eddyward eddyward
23 мар. 2011 г. 07:25:35

Да, потому что именно это ты и просил.

zeo zeo
23 мар. 2011 г. 07:44:46
0

Это решение было опубликовано на 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);

Надеюсь, это поможет.

9 февр. 2017 г. 22:13:55
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');
1 авг. 2023 г. 08:47:35
Комментарии

вдохновлено предыдущим комментарием от @Jan Fabry

Abouasy Abouasy
1 авг. 2023 г. 08:49:00