Удаляем ссылку у текущего пункта меню 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. Валерий
    20 мая 2019 г. в 12:23

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

  2. 8 сентября 2019 г. в 00:56

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

  3. 30 мая 2020 г. в 21:52

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

    1. Ничего не должно дублироваться. Только убирается атрибут href у ссылки текущей страницы.

  4. Myakish
    4 июня 2020 г. в 06:32

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

  5. 29 июля 2020 г. в 08:36

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

  6. Wolf
    4 ноября 2022 г. в 18:05

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

  7. Александр
    19 ноября 2022 г. в 15:07

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

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

Жирный текст

Ссылка

Цитата

Внутристрочный код

CSS-код

HTML-код

JavaScript-код

PHP-код