Главная WordPress

Удаляем ссылку у текущего пункта меню WordPress

Очень часто в техническом задании на создание шаблона для WordPress значится пункт: “Не должно быть циклических ссылок”. Это означает, что, когда мы находимся на какой-либо странице, на ней не должно быть ссылок на саму себя.

Чтобы выполнить данное требование для меню WordPress, существует решение, которое с помощью регулярного выражения вырезает ссылку текущей страницы, оставляя только текстовое название пункта.

На мой взгляд, это некрасивое решение, и я предлагаю взамен следующее – удалять у ссылки атрибут href.

В спецификации HTML 5 обозначена следующая информация на этот счет:

If the a element has no href attribute, then the element represents a placeholder for where a link might otherwise have been placed, if it had been relevant, consisting of just the element’s contents.

Здесь сказано, что ссылка, не имеющая атрибута href, когда это уместно, является плейсхолдером (замещающим элементом) для полноценной ссылки. И это как раз наш случай.

Таким образом, ссылка без href соответствует стандарту, к тому же является валидной. При этом она по сути перестает быть ссылкой: у нее отсутствует соответствующий курсор, по ней нельзя никуда перейти, не работает псевдокласс :link и нет подчеркивания.

Вот код, который решает поставленную задачу (его необходимо поместить в файл functions.php вашей темы):

function wp_nav_menu_no_current_link( $atts, $item, $args, $depth ) {
	if ( $item->current ) $atts['href'] = '';
	return $atts;
}
add_action( 'nav_menu_link_attributes', 'wp_nav_menu_no_current_link', 10, 4 );

Если есть необходимость применить это только для конкретного меню, то код будет таким:

function wp_nav_menu_no_current_link( $atts, $item, $args, $depth ) {
	if ( $args->theme_location == 'menu_name' ) {
		if ( $item->current ) $atts['href'] = '';
	}
	return $atts;
}
add_action( 'nav_menu_link_attributes', 'wp_nav_menu_no_current_link', 10, 4 );

Здесь menu_name – это идентификатор, который указывается в функции register_nav_menu() и в параметре theme_location функции wp_nav_menu().

Комментарии (8)

  1. Здравствуйте Дмитрий!
    Примите мою большую благодарность, за данный код…
    Я перепробовал много разных вариантов – работает только Ваш.
    Сохраню ка я сайт в закладках – уверен, что ещё не раз пригодится… ☺

  2. Реально спасибо, работает как надо)

  3. Добрый день! Первый код нормальный. Но, если проверяешь ссылки с другого пункта меню, то получается что главная дублируется как ссылка и как безанкорная ссылка. Это допустимо?

  4. Спасибо за код и за ссылку в спецификацию HTML-5. Очень пригодилось для беседы с Заказчиком

  5. спасибо, работает

  6. Все хорошо но поле title пустое у ссылки и как добавить свой стиль ?

  7. Спустя 9 лет убрал это с сайта. Спасибо!

Ваш комментарий