Liberbox

Рейтинг
2
Регистрация
28.08.2014

Доброго времени суток! Помогите дилетанту, пожалуйста, решить проблему с классами меню.

Меню вывожу с помощью 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 ) . '"';

Но как сделать не знаю.

Может у кого-то есть решение по этому вопросу? Спасибо.

psics:
а javascript ом не хочешь попробывать сделатЬ?

Можно попробовать, но я не шарю🤣 Я ж не спец. Так, решил сделать сайт самостоятельно, думал, что разберусь. В основах вроде как разобрался, но оказалось, что чем дальше в лес, тем толще партизаны. Вообщем сделал меню отдельными ссылками, а не страницами.

Камрады, подсскажите, возможно ли в постоянные ссылки в меню вставить якорь?

Использую функцию wp_nav_menu, надо сделать так, чтобы по клику переход был в заданное место, а не просто на страницу. Попробовал через админпанель. В настройках меню в графе "Текст ссылки" прописал

<a href="/адрес сраницы#anchor">Текст</a>
всё работает, но в итоге в НТML получается двойной тег <a>

<li......<a href="адрес страницы"><a href="адресстраницы#anchor">Текст</a></a></li>.

Гугл по этому поводу молчит. Как сделать правильно? Или хочу невозможного?

12
Всего: 13