Доброго времени суток! Помогите дилетанту, пожалуйста, решить проблему с классами меню.
Меню вывожу с помощью wp_nav_menu, естественно в тегах генерируется куча ненужных id и
классов. Задача убрать всё, кроме класса родителя, предка и текущей страницы.
В сети нашёл некоторые готовые решения, но в итоге всё-равно получается не то, что надо.
Для того, чтобы убрать лишние ID и классы:
1) Заменяю названия классов, генерируемых автоматически:
function replace_menu_css_class($text) { $my_classes = array( 'menu-item' => '', '-type-custom'=>'', '-object-custom'=>'', '-home'=>'', '-type-post_type'=>'', '-object-page'=>'', '-has-children'=>'page-has-children', 'current-page-ancestor'=>'', 'current-menu-ancestor'=>'', 'current_page_parent'=>'current_parent', 'current-menu-parent'=>'', 'current_page_ancestor'=>'current_ancestor', '-type-custom'=>'', '-object-custom'=>'', 'current-'=> 'current-page', ); $text = str_replace(array_keys($my_classes), $my_classes, $text); return $text; } add_filter( 'nav_menu_css_class', 'replace_menu_css_class' );
2) Добавил новый класс Walker. Взял кастомный и просто удалил оттуда некоторые элементы таким образом:
- в этом куске удалил третью строчку, которая, как я понял отвечает за вывод класса menu-item-ID страницы
/* Генерируем строку с CSS-классами элемента меню*/ $class_names = $value = ''; $classes = empty( $item->classes ) ? array() : (array) $item->classes; $classes[] = 'menu-item-' . $item->ID;
- полностью удалил кусок, отвечающий за генерацию ID
/* Генерируем ID элемента*/ $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args ); $id = strlen( $id ) ? ' id="' . esc_attr( $id ) . '"' : '';
- в этом куске удалил . $id, чтобы исключить вывод ID тега <li>
/* Генерируем элемент меню */ $output .= $indent . '<li' . $id . $value . $class_names .'>';
В итоге получилось так:
class True_Walker_Nav_Menu extends Walker_Nav_Menu { /** * @see Walker::start_el() * @since 3.0.0 * * @param string $output * @param object $item Объект элемента меню, подробнее ниже. * @param int $depth Уровень вложенности элемента меню. * @param object $args Параметры функции wp_nav_menu */ function start_el(&$output, $item, $depth, $args) { global $wp_query; $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; /* * Генерируем строку с CSS-классами элемента меню */ $class_names = $value = ''; $classes = empty( $item->classes ) ? array() : (array) $item->classes; // функция join превращает массив в строку $class_names = join(' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) ); $class_names = ' class="' . esc_attr( $class_names ) . '"'; /* * Генерируем элемент меню */ $output .= $indent . '<li' . $value . $class_names .'>'; // атрибуты элемента, title="", rel="", target="" и href="" $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 ) .'"' : ''; // ссылка и околоссылочный текст $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 ); } }
HTML получается почти правильный
<ul id=menu><li class=" current_parent current_ancestor page-has-children"><a href="адрес">Заголовок</a> <ul class="sub-menu"> <li class=" current-page"><a href="адрес">Заголовок</a></li> <li class=" "><a href="адрес">Заголовок</a></li> <li class=" "><a href="адрес">Заголовок</a></li> <li class=" "><a href="адрес">Заголовок</a></li> </ul> </li> </ul>
Не устраивает то, что при отсутствии класса у тега <li> остаётся <li class=" ">, т.е. цель убрать class=" ", если у <li> нет класса и убрать пробелы после первой кавычки, если <li> имеет классы.
Понимаю, что где-то в этой части кода надо править
// функция join превращает массив в строку $class_names = join(' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) ); $class_names = ' class="' . esc_attr( $class_names ) . '"';
Но как сделать не знаю.
Может у кого-то есть решение по этому вопросу? Спасибо.
Можно попробовать, но я не шарю🤣 Я ж не спец. Так, решил сделать сайт самостоятельно, думал, что разберусь. В основах вроде как разобрался, но оказалось, что чем дальше в лес, тем толще партизаны. Вообщем сделал меню отдельными ссылками, а не страницами.
Камрады, подсскажите, возможно ли в постоянные ссылки в меню вставить якорь?
Использую функцию wp_nav_menu, надо сделать так, чтобы по клику переход был в заданное место, а не просто на страницу. Попробовал через админпанель. В настройках меню в графе "Текст ссылки" прописал
<a href="/адрес сраницы#anchor">Текст</a>
<li......<a href="адрес страницы"><a href="адресстраницы#anchor">Текст</a></a></li>.
Гугл по этому поводу молчит. Как сделать правильно? Или хочу невозможного?