Удаляем ссылку у текущего пункта меню 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().

Ваш комментарий будет первым