Автоматическое добавление атрибута nofollow ко всем внешним ссылкам в постах

Так вот, иногда бывает, что внешние ссылки с сайта нужно закрыть через rel="nofollow" (зачем? — это уже тема отдельного поста), в вордпрессовских комментах атрибут проставляется автоматически, там всё ок, а вот в постах приходится прописывать его к каждой ссылке вручную, ну или скачать какой-нибудь плагин для этих целей.

Первый вариант не подходит из-за своей нудности, да и что делать в том случае, если вы не единственный автор на блоге?

Ну а плагин… Зачем использовать плагин, который можно заменить несколькими строчками кода? Вот этого кода:

function true_wp_posts_nofollow_callback($matches){
	$a = $matches[0];
	$site_url = site_url();
 
	if (strpos($a, 'rel') === false){
		$a = preg_replace("%(href=\S(?!$site_url))%i", 'rel="nofollow" $1', $a);
	} elseif (preg_match("%href=\S(?!$site_url)%i", $a)){
		$a = preg_replace('/rel=S(?!nofollow)\S*/i', 'rel="nofollow"', $a);
	}
	return $a;
}
 
function true_wp_posts_nofollow($content) {
	return preg_replace_callback('/<a[^>]+/', 'true_wp_posts_nofollow_callback', $content);
}
 
add_filter('the_content', 'true_wp_posts_nofollow');

После вставки этого сниппета в functions.php попробуйте добавить несколько ссылок в пост и посмотреть исходный код, вот что получилось у меня:

исходящие ссылки с атрибутом nofollow в постах

Функция wp_rel_nofollow()

Если хотите закрыть через nofollow все ссылки — и внутренние, и внешние — используйте функцию wp_rel_nofollow(), вот пример кода:

function true_wp_posts_nofollow($content) {
    return stripslashes(wp_rel_nofollow($content));
}
 
add_filter('the_content', 'true_wp_posts_nofollow');

А в комментариях будет обратный процесс, там WordPress наоборот добавляет везде rel="nofollow" по умолчанию, естественно внутренним ссылкам этот атрибут ни чему.

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

Комментарии — 12

Комментирование этого поста более не доступно.
  • Ник 26 ноября 2012 #

    Миша, привет. Извини за оффтоп, но очень понравилась форма поиска у тебя блоге. Мог бы дать файлы, что бы реализовать такое же у себя?

  • Миша 4 декабря 2012 #

    похоже код не работает с поддоменами)

  • perozavodsky 5 января 2015 #

    последняя регулярка не четкая

  • Sergey 7 июня 2015 #

    Привет, стоит php 5.6.4 при добавлении на блог данного кода в функции темы выводит ошибку в хидере блога

    posts_nofollow_callback($matches){ $a = $matches[0]; $site_url = site_url(); if (strpos($a, 'rel') === false){ $a = preg_replace("%(href=\S(?!$site_url))%i", 'rel="nofollow" $1', $a); } elseif (preg_match("%href=\S(?!$site_url)%i", $a)){ $a = preg_replace('/rel=S(?!nofollow)\S*/i', 'rel="nofollow"', $a); } return $a; } function true_wp_posts_nofollow($content) { return preg_replace_callback('/]+/', 'true_wp_posts_nofollow_callback', $content); } add_filter('the_content', 'true_wp_posts_nofollow');

    на php 5.5 проблем замечено не было такое ощущение что в 5.6 что-то изменили, не подскажите в чем проблема? спасибо

    • Миша 8 июня 2015 #

      Привет, а какая конкретно ошибка?

      • Sergey 8 июня 2015 #

        просто в хидере выводит строку текстом указанную выше. такое ощущение что какието функции в php 5.6 были изменены и код просто не отрабатывается интерпретатором...

    • petrozavodsky 8 июня 2015 #

      а перед

      posts_nofollow_callback($matches)....

      слово function не забыли вставить ?

      • Sergey 8 июня 2015 #

        не забыл(

  • Petrozavodsky 8 июня 2015 #

    А какой текст ошибки тогда ?

  • Дмитрий 6 июля 2015 #

    спасибо! а можно к этому коду добавить исключения? есть второй свой сайт и вот если ссылка на него ставится то хотелось бы чтобы вордпресс воспринимал бы его как "внутреннюю" ссылку.

    • Миша 7 июля 2015 #

      Да, помимо переменной текущего сайта $site_url вам надо добавить еще одну, со ссылку на другой сайт + указать её в регулярках.