Самоссылки возвращаются|Убираем самоссылки на страницы
Несмотря на то, что я должен давно спать, — у меня завтра последняя «процедура», — вам очередной лилипутский хак, который я использовал в шаблоне для Кеноби. На, который, как обычно, все плюют с высокой колокольни (злобный оскал).
Он опять затрагивает тему самоссылок.
Вы, наверное, знаете (я знаю это от Блогомоббера), что Вордпресс при выводе списка страниц блога (с помощью 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, как это должно быть.
Но пусть хотя бы это останется на совести самих разработчиков ВП.




Спасибо, первый раз об этом услышал. пошел исправлять косяки.
Скажите, а зачем нужно убирать самоссылки?
@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 темы создаю функции и подвешиваю их на хуки (соответственно для страниц, категорий и облака тегов):
Соответственно, чистку мусора (первую строчку) можно сделать одинаково в обеих функциях — проще всего взять ту, что в категориях.
Ну и ВП в комментариях немного побил код, так что надо использовать тот, который приходит на почту :)
Огромное спасибо! Буду пробовать.
Единственное место где нужны самоссылки — это новостная лента, хотя и в этом случае проще просто перезагрузить страничку.
Если уточнять, то не только на новостных лентах, вообще на частообновляющихся страницах (например, веб-сервисы вроде Твиттера). Но и в простых случаях иногда не стоит заморачиваться.
Э, я старую версию скрипта кинул, правильнее использовать вот так iskariot.ru/development/selflink-lists/
Полезно, использую!