Как избавиться от внешних ссылок в WordPress
January 20, 08 by TracKerСпросил меня недавно NOMAD “Как избавиться от ВС в комментариях”, решил поделиться опытом, как это сделать в WordPress.
Первое что важно запомнить, это то что ссылки на комментаторов нельзя ни в коем случае удалять, это признак плохого тона автора блога. Удаляя ссылку вы разрушаете связь с комментатором. Вместо этого ссылку можно немного модифицировать, отправив ее, например, через скрипт переадресации. Таким образом Внешний Адрес будет находится как-бы в вашем домене, и как Внешняя Ссылка учитываться не будет.
О том как сделать скрипт переадресации я писал в этом посте: Убираем внешние ссылки. Сделать нужно все что написано в посте, вплоть до запрета его индексации в robots.txt.
Как только скрипт готов идем в папку с темплейтом вашего блога, к примеру “/wp-content/themes/default/” находим файл “functions.php” и редактируем его.
Перед тем как перейти непосредственно к редактированию, разберем основные источники ВС в блоге на WordPress и методы борьбы с ними.
И так первый источник ВС это ссылки на автора темы. Обычно они расположен в футере (footer.php), но бывают и исключения, поэтому первым делом следует прошерстить темплейт на их наличие. Бороться с ними не сложно. Такие ссылки можно просто взять в “<noindex>“, примерно так:
<noindex>Powered by <a href="http://wordpress.org/">WordPress</a></noindex>
Все что попадает в “<noindex>” не будет учитываться роботом Яндекса, поэтому с этим тегом нужно быть по осторожнее.
Со статическими ВС разобрались, теперь приступим к динамическим. Осталось несколько мест где могут появляться ВС, это: посты (содержание постов), комментарии и sidebar (их может быть несколько и называться они могут по разному, но это сути не меняет). Теперь перейдем непосредственно к редактированию “functions.php” о котором я писал выше.
Начнем с Постов. Чтобы избавиться от ВС в содержании поста необходимо поставить фильтр на “the_content”. Система фильтров в WordPress очень хорошо развита и позволяет фильтровать практически все что угодно. Итак ставим фильтр:
add_filter('the_content', 'removeLinks');
Вторым параметром к add_filter мы указываем функци, которая и будет фильтровать текст. Собственно код функции:
function preg_callback2($matches) { $url = explode(':', $matches[2]); if (($url[0] == 'http') || ($url[0] == 'https')) { $need = "http://tracker2k.kiev.ua"; $replace = "http://tracker2k.kiev.ua/redirect.php?"; if (substr($matches[2], 0, strlen($need)) != $need) { $matches[2] = $replace.$matches[2]; } } return $matches[1].$matches[2].$matches[3]; } function removeLinks($content) { if (! is_feed()) { $content = preg_replace_callback('@(]*href=")([^>\"]*)("[^>]*>)@i', "preg_callback2", $content); $content = preg_replace_callback('@(]*href=\')([^>\"]*)(\'[^>]*>)@i', "preg_callback2", $content); } return $content; }
Для замены ссылок я использовал регулярные выражения, поэтому добавилась еще одна функция обратного вызова. Чтобы адаптировать под себя вам следует заменить всего два параметра в функции preg_callback2, а именно $need и $replace. В $need следует указать полный адрес вашего сайта без слеша в конце, а в $replace путь в redirect.php со знаком вопроса (“?“) в конце. В принципе с постами мы закончили.
Теперь перейдем к комментариям. С ними, в принципе, дела обстоят точно также. Следует отфильтровать всего три – четыре параметра, с использованием описанной выше функции. Другими словами к написанному выше следует дописать:
add_filter('comment_text', 'removeLinks'); add_filter('get_comment_author_link', 'removeLinks'); add_filter('get_comment_author_url_link', 'removeLinks'); add_filter('comment_url', 'removeLinks');
Идем дальше. Следующим пунктом идет sidebar. С ним сложнее всего. С сайдбаре может быть множество виджетов генерируемых другими плагинами, которые в свою очередь генерируют ВС. Однако весь сайдбар ставить в <noindex> было бы ошибкой, так как можно лишится индексации многих страниц и разделов. Я расскажу о тех Виджетах с которыми работал.
Проше всего бороться с ВС у виджета Text, в нем у меня лежали каунтеры, кнопки и пр. Тут всеголишь следует добавить в начало и конец кода в Виджете “<noindex>” и “</noindex>” соответственно. Далее виджет Links, он используется для генерации Blogroll. Тут необходимо установить еще один фильтр и написать еще одну функцию:
function removeLinks_Blogroll($p1) { foreach ($p1 as $obj) { $obj->link_url = "http://tracker2k.kiev.ua/redirect.php?" . $obj->link_url; } return $p1; } add_filter('get_bookmarks', 'removeLinks_Blogroll');
Подразумевается, что в Blogroll все ссылки Внешние, поэтому их проверка не производится. Чтобы адаптировать под себя, следует заменить “http://tracker2k.kiev.ua/redirect.php?” на то же значения что и $replace в preg_callback2. Также генерировать ВС может виджет Meta, вместо него я использую собственный, заменяющий его. Чтобы внести изменения в остальные виджеты генерирующие ВС необходимо править код WordPress, что весьма не хорошо. Некоторые виджеты, работающие на базе дополнительных плагинов дают возможность вставлять свои теги в свои начало и конец, например Flickr.
Собственно все.
В итоге у вас должен получиться следующий код:
function preg_callback2($matches) { $url = explode(':', $matches[2]); if (($url[0] == 'http') || ($url[0] == 'https')) { $need = "http://tracker2k.kiev.ua"; $replace = "http://tracker2k.kiev.ua/redirect.php?"; if (substr($matches[2], 0, strlen($need)) != $need) { $matches[2] = $replace.$matches[2]; } } return $matches[1].$matches[2].$matches[3]; } function removeLinks($content) { if (! is_feed()) { $content = preg_replace_callback('@(]*href=")([^>\"]*)("[^>]*>)@i', "preg_callback2", $content); $content = preg_replace_callback('@(]*href=\')([^>\"]*)(\'[^>]*>)@i', "preg_callback2", $content); } return $content; } add_filter('the_content', 'removeLinks'); add_filter('comment_text', 'removeLinks'); add_filter('get_comment_author_link', 'removeLinks'); add_filter('get_comment_author_url_link', 'removeLinks'); add_filter('comment_url', 'removeLinks'); function removeLinks_Blogroll($p1) { foreach ($p1 as $obj) { $obj->link_url = "http://tracker2k.kiev.ua/redirect.php?" . $obj->link_url; } return $p1; } add_filter('get_bookmarks', 'removeLinks_Blogroll');
Tod Says: 20.01.08 at 22:46
А какой смысл избавляться от внешних ссылок?
TracKer Says: 20.01.08 at 23:01
Tod, это нужно если сайт продает ссылки на какой-то бирже, например в SAPE.
Ptath Says: 21.02.08 at 17:59
Имхо править function.php — плохая идея. Я сделал плагин, содержащий этот код и он прекрасно пашет.
Если автор додумается, как заменить “http://tracker2k.kiev.ua” в автомате на ссылку блога, готовый плагин можно выкладывать на wordpress.org
Ptath Says: 21.02.08 at 18:00
Забыл спросить, а как это работает вместе с блоговаром? =) Мне кажется он не сбудет понимать такие ссылки и игра сойдет на нет.
(Жаль что на комменты нельзя подписаться)
TracKer Says: 21.02.08 at 18:46
Проверено на практике, с Блоговаром работает на ура
Вместо “http://tracker2k.kiev.ua” можно спрашивать параметр к настройке виджета (как например название у виджета Text) через панель настройки виджета, и хранить в БД средствами вордпресс. Я когда-то такое делал, так что если хотите можем организовать соавторство
Присылайте на мыло, я допишу 
tracker2k (wof) gmail.com
А вообще функции для сбора и сохранения параметров: get_option и update_option
Регистрация панели управления виджетом: register_widget_control
За пример можно взять любой виджет-плагин с такой панелькой, я брал “Configurable Tag Cloud”.
>> Жаль что на комменты нельзя подписаться
Исправим
Ptath Says: 21.02.08 at 19:55
Щас займусь богоугодным делом =)
Ветер Says: 22.07.08 at 12:16
Великолепный скрипт! Давно нечто подобное искал! Спасибо большое, решили большую проблему!)
Flector Says: 03.08.08 at 07:03
ох, не слишком ли это сложное решение? прям как из пушки по воробьям и все ради того, чтобы убрать внешние ссылки в wordpress.
TracKer Says: 03.08.08 at 19:46
Flector, на момент написания статьи такой информации я найти не смог. И вот решил поделиться своим опытом, а насколько это сложно решать вам.
Знаете способ лучше, буду рад услышать
Krylov » Wordpress – экранирование внешних ссылок Says: 09.04.10 at 16:04
[...] http://tracker2k.kiev.ua/kak-izbavitsya-ot-vneshnix-ssylok-v-wordpress.html http://tracker2k.kiev.ua/ubiraem-vneshnie-ssylki.html http://tracker2k.kiev.ua/privodim-vneshnie-ssylki-v-chelovecheskij-vid.html Categories: Web Tags: javascript, php, wordpress Комментарии (0) Уведомления (0) Написать комментарий Уведомление [...]
Patrick Says: 12.04.10 at 12:06
А есть нормальный плагин для версии 2,9,3????
TracKer Says: 21.04.10 at 16:10
Patrick, когда-то был плагин “(J)ExR – JawsIk External Redirect Plugin”, однако насколько он актуален и пригоден к WordPress 2.9.3 говорить не могу…
Дмитрий Says: 08.05.10 at 01:08
А не проще ли футер закрыть так <!– Текст –>
TracKer Says: 04.06.10 at 11:18
Дмитрий, а не проще ли весь сайт закоментить тогда?
Или вообще закрыть и не париться
darmoid Says: 28.09.10 at 15:29
а не проще использовать плагин (J)ExR? с версией 2.9.2 работает прекрасно
TracKer Says: 28.09.10 at 15:41
darmoid, проще конечно. Только когда эта статья писалась такого плагина в помине не было…
Дмитрий Says: 01.04.11 at 22:00
ЧТо то у меня не пашет этот вариант. Ссылки в новостях так и остаются