Самоссылки возвращаются|Убираем самоссылки на страницы

Несмотря на то, что я должен давно спать, — у меня завтра последняя «процедура», — вам очередной лилипутский хак, который я использовал в шаблоне для Кеноби. На, который, как обычно, все плюют с высокой колокольни (злобный оскал).

Он опять затрагивает тему самоссылок.

Вы, наверное, знаете (я знаю это от Блогомоббера), что Вордпресс при выводе списка страниц блога (с помощью wp_list_pages), по умолчанию проставляет текущей странице класс .current_page_item. Точнее говоря, он будет прикручен элементу списка, если вы находитесь именно на этой page.

Например, можно почувствовать себя Копперфильдом и заставить пункт меню исчезнуть:

.current_page_item {text-indent:-9999px}

Естественно, если в списке меню так же присутствуют другие элементы, надо позаботиться и о их выделении. Например, в случае главной получится примерно такой код:

<ul>
<li class="page-item page-item-home
	<?php if($_SERVER['REQUEST_URI']=='/') echo ' current_page_item' ?>">
	<a title="на главную страницу" href="<?php bloginfo('url') ?>">
		Главная
	</a>
</li>
<?php wp_list_pages('sort_column=menu_order&&depth=1&title_li=');?>
</ul>

Но, вот беда, пункт меню останется активным — на нем все еще будет стоять дурацкая ссылка.

Нет, бывают случаи, когда ссылка должна остаться, особенно, если она используется в качестве буркмарклета, но в большинстве случаев её надо «уйти». К счастью, к функции есть доступ через API.

Можно, например, отслеживать появление класса .current_page_item в ссылке, но можно и просто ориентироваться на название текущей страницы (вы же не называете две разные страницы одинаково?).

add_filter('wp_list_pages', 'correct_list_pages', 15);
function correct_list_pages($output){
	global $post;
	$search='~(<li[^>]+>)(<a[^>]+>)('.get_the_title().')(<\/a>)(<\/li>)~i';
	$output=preg_replace($search,'\\1\\3\\5',$output);
	return $output;
}

Вот такой код, помещенный в старый добрый functions.php, даст желаемый результат. Функции самого шаблона трогать при этом не нужно.

Если в меню также появляется ссылка на главную страницу, то и код, приведенный в начале, придется немного изменить.

<ul>
<?php if($_SERVER['REQUEST_URI']=='/') : ?>
<li class="page-item page-item-home current_page_item">
	Главная
</li>
<?php else : ?>
<li class="page-item page-item-home">
	<a title="на главную страницу" href="<?php bloginfo('url') ?>">
		Главная
	</a>
</li>
<?php endif ?>
<?php wp_list_pages('sort_column=menu_order&&depth=1&title_li=');?>
</ul>

Тут есть еще одна деталь. С технической стороны, еще одна wrong detail в работе функции в том, что она присваивает элементам списка идентификаторы вида .page-item-%page_ID% в виде класса, а не id, как это должно быть.

Но пусть хотя бы это останется на совести самих разработчиков ВП.

{18 комментариев} Подписка на комментарии

Спасибо, первый раз об этом услышал. пошел исправлять косяки.

Скажите, а зачем нужно убирать самоссылки?

@Yohan: В случае, если контент не часто обновляемый в рубрике, на странице и т.п. (из примеров обновляемого — твиттер), то они просто-напросто лишние. Плюс они запутыают — если пункт меню ссылкой, то значит, я могу опять перейти на страницу, на которой уже нахожусь. Ну и, в-третьих, а смысл ссылку оставлять? :)

Пошел потрошить свой блог :-)

Ссылки в меню запутывают? Я не соглашусь... Скорее наоборот — если ссылка в меню будет пропадать — это вот точно запутает. Посмотрите, можно сказать что почти ВСЕ сайты в сети, где есть меню — ссылку оставляют, когда пользователь переходит в него. Люди привыкли — поэтому если убирать – это стопудово запутает.

Спасибо за код: add_filter ('wp_list_pages', 'correct_list_pages', 15); Не знал что так можно делать – очень пригодилось!

Со своей стороны советую посмотреть действительно хорошие сайты не на стандартных движках — ссылку убирают. «Убирают» — не значит, скрывают, а только выделяют текст и снимают ссылку. Тыкнуть нельзя — значит, я на ней — логика проста. А вот как выделять — это тот еще вопрос.

Кроме того, «все» никогда не было аргументом. Еще 5 лет назад все сайты были с сайдбарами слева, пока не начали доказывать, что справа они удобнее.

Код — стандартная функция хуков под Вордпресс. Список можно найти в Кодексе ВП или на wphooks.flatearth.org

А приведите примеры таких хороших сайтов... Я чет не могу найти таких...

Если смотреть вечно на сторону, с женой никогда хорошей семьи не получится.

К тому же стоит меньше разглядывать шаблонные сайты на шаблонных движках, чтобы увидеть верхнее меню что в гугле, что в яндексе. Посмотрите на тот же русский башорг. Или на табак.ру, сделанный в САЛ.

Я не понимаю, у вас есть какой-то аргумент за ссылку на страницу, на которой и так находитесь? На газете.ру и вконтакте, например, в отличие от Хабра и ленты.ру, нет даже выделения, хотя ссылка — логичное продолжение скоротечной динамичности страниц.

Про табак — зачетный сайтец!!! :)

А если серьезно — посмотрел гугл, яндекс — они действительно убирают ссылки.

Буду экспериментировать! :)

Не подскажете, как сделать тоже самое для вывода категорий функцией wp_list_categories?

Новые версии ВП сами подставляют классы к li в стандартных функциях вывода (если выводится списком) — соответственно .current-cat, .current-tag, .current-page. Но ссылка остается, да и еще «мусорные» классы добавляются.

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

//хачим категории
add_filter('wp_list_categories', 'correct_list_categories', 15);
function correct_list_categories($output){
	$output=preg_replace('~]+)>~i','',$output);
	if(!is_category()) return $output;
	$output=preg_replace('~<a>]+>('.single_cat_title('',false).')</a>~i','$1',$output);
	return $output;
} 

//хачим теги
add_filter('wp_tag_cloud', 'correct_tag_cloud', 15);
function correct_tag_cloud($output){
	$output=preg_replace("~\s*class=\'[^\']+\'~i",'',$output);
	if(!is_tag()) return $output;
	$output=preg_replace('~<a>]+>('.single_tag_title('',false).')</a>~i','$1',$output);
	return $output;
}

//хачим страницы
add_filter('wp_list_pages', 'correct_list_pages', 15);
function correct_list_pages($output){
	$output=preg_replace('~]+)>~i','',$output);
	if(!is_page()) return $output;
	$search='~<a>]+>('.get_the_title().')~i';
	$output=preg_replace($search,'\\1',$output);
	return $output;
}

Соответственно, чистку мусора (первую строчку) можно сделать одинаково в обеих функциях — проще всего взять ту, что в категориях.

Ну и ВП в комментариях немного побил код, так что надо использовать тот, который приходит на почту :)

Огромное спасибо! Буду пробовать.

Единственное место где нужны самоссылки — это новостная лента, хотя и в этом случае проще просто перезагрузить страничку.

Если уточнять, то не только на новостных лентах, вообще на частообновляющихся страницах (например, веб-сервисы вроде Твиттера). Но и в простых случаях иногда не стоит заморачиваться.

Э, я старую версию скрипта кинул, правильнее использовать вот так iskariot.ru/development/selflink-lists/

Полезно, использую!

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


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