Самоссылки в навигации

Дублируя комментарий к посту о самоссылке (кстати, я тогда просто не подумал о простейшем is_home()&&!is_paged(), который легко обходит и установку во вложенный каталог) привожу код для удаления ссылок в трех самых часто используемых списках в шаблонах Вордпресса, который использую лично я. Дублирую потому что кинул неправильный код из старых каких-то тем, и потому что в комментариях были съедены целые куски кода.

Дело в том, что по умолчанию ВП пихает на каждый элемент кучу бесполезных классов, даже если смотреть со стороны семантики — ну кому интересен номер конкретной рубрики в базе. И на элементе с текущей же рубрикой/тегом/страницей, если мы находимся на ней, также вешается класс (единственный полезный, да). При этом ссылка остается активной, что ведет все к той же «петле».

Так что у нас две задачи. Первая — удалить весь мусор в списке (механизм ВП не оставляет нам выбора, как использовать регэкспы). Вторая — если мы находимся на нужной странице, убрать тег ссылки, ну и, естетсвенно, на li оставив класс для выделения (но .current-cat, .current-page я меняю на просто .current — этого всегда достаточно).

Функция получается такая:

function correct_list_pages($output){
	if(!is_category())
		return preg_replace('~<li([^>]+)>~i','<li>',$output);
	$output=preg_replace('~(<li)[^>]+(current)[^>]*(>[^<]*)<a[^>]+>([^>]*)</a>([^<]*</li>)~i','$1 $2$3$4$5',$output);
	$output=preg_replace('~<li\s*class="([^>]+)"\s*>~i','<li>',$output);
	$output=preg_replace('~<li current>~i','<li class="current">',$output);
	return $output;
}

Красота и скорость здесь не особенно важны, так что и замарачиваться с ними не стоит. Полученную функцию вешаем на нужный(е) фильтр(ы) в functions.php, который лежит в теме.

Например:

add_filter('wp_list_pages', 'correct_list_pages', 1);
add_filter('wp_list_categories', 'correct_list_pages', 1);
add_filter('wp_tag_cloud', 'correct_list_pages', 1);

Минус этого подхода в том, что при немного другом формате может не срабатывать. Кроме того, сторонние плагины (например, Simple Tags) этим хуком не подхватятся (правда, даже в таких профессиональных плагинов функции не подвешены на хуки, и это отвратительно). Можно, конечно, использовать определение текущей по ID (его можно найти по -\d+\s), но и так достаточно.


Понятное дело, есть тонкость в определении, нужно здесь убирать ссылку или оставлять ее, а в некоторых случаях — убирать и сам титл рубрики/тега/страницы. Тут обычно каждый решает сам, но лучше включить логику.

Выбираем светильники citilux, globo, lussole в Салоне света.
{5 комментариев} Подписка на комментарии

> механизм ВП не оставляет нам выбора, как использовать регэкспы

Оставляет, но он не менее геморройный, чем регулярные выражения.

Можно передавать в параметре walker объект, порождённый от Walker. Тогда WordPress будет использовать именно его для отрисовки списка. А с облаком тэгов без регэкспов не справиться.

Использовать здесь Уолкер — сизифов труд, да.

Да, предыдущее решение у меня работало до тех пор, пока не появились вложенные странички.

Стал пробовать этот вариант — мусор уходит, а ссылки остаются...

У меня не получилось применить это для Меток и страниц. Заработало только с категориями)

Напишите пожалуйста код для меток, страниц и категории для вставки в Functions.php и шаблон.php

p.s. Я не умею программировать на php. Знаю хорошо только html и css

Насколько я понял, этот код только для категорий.

Я подменял «is_category» на всевозможные «is_tag», «is_tag_cloud», «is_page», но это не помогло.

А здесь можно оставить свое мнение ↓ Подписка на комментарии
какие-то из следующих трех полей можно оставить пустыми


нет тегам!!! **эмоция**, __ирония__, >цитата, {[код]}