Приветствую друзья. После сегодняшнего апдейта поисковой базы Яндекса обнаружил резкое увеличение количества проиндексированных страниц, добавилось несколько десятков. Столько статей я не писал, а все стандартные дубли, типа replytocom, архивы, страницы авторов у меня закрыты давно. В том же Яндекс Вебмастере в структуре сайта появился каталог wp-json, со вложенным oembed и далее. Первоначально подумалось, что снова сайт взломали и залили на него какой-то дорвей.

wp json oembed

Кстати, заглядывать периодически в webmasters.yandex.ru привычка полезная, не раз она помогала мне вовремя найти проблемы.

Так вот, открыл я указанный каталог на сайте и увидел странный код, на первый взгляд не несущий ничего путевого. Ссылок на сторонние ресурсы тоже не было, на дорвей не похоже.

код wp-json

Следующим шагом залез к себе на хостинг в поисках заветной папочки, но никакой wp json oembed не нашлось и там. В этот момент мысль о дорвее стала меня покидать, так как хакеры залили бы раздел на сайт и оставили бы следы вирусов, но я не встречал такого, чтобы они делали это через стандартные папки WordPress.

Тем более, больно быстро поисковик нашел эти страницы, скрытые каталоги так бодро не индексируются.

Оказалось, что Яндекс их быстро кушает от того, что ссылки на них стоят в исходном коде обычных документов сайта в разделе header через метатег link, получается, что с каждой страницы сайта идет ссылка на этот злосчастный каталог.

header wp-json

В самом файле header.php ничего подобного я не нашел, значит подключается ссылка через функции движка.

Скорее всего, подумалось мне, это какая-то новая фича CMS, которую разработчики WordPress внедрили, а довести до ума не соизволили. Поиск по запросу «wp json» принес быстрый результат. Спасибо коллегам вебмастерам, которые реагируют на все новинки более оперативно.

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

Как убрать wp json?

Метод борьбы с запретом индексации через robots.txt некорректен, правильно будет устранить корень проблемы — физически отключить появление ссылок в коде сайта и запретить появление соответствующих страниц.

Делается это все через файл functions.php шаблона, добавлением группы специальных хуков, блокирующих соответствующие функции. Нужно добавить в этот файл нижеследующие строки. Добавлять лучше в начало после <?php или в самом конце, перед закрывающим ?>. В некоторых темах закрывающей скобки в в этом файле нет, там просто в конец добавляйте.

// Отключаем сам REST API
 add_filter('rest_enabled', '__return_false');

// Отключаем фильтры REST API
 remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
 remove_action( 'wp_head', 'rest_output_link_wp_head', 10, 0 );
 remove_action( 'template_redirect', 'rest_output_link_header', 11, 0 );
 remove_action( 'auth_cookie_malformed', 'rest_cookie_collect_status' );
 remove_action( 'auth_cookie_expired', 'rest_cookie_collect_status' );
 remove_action( 'auth_cookie_bad_username', 'rest_cookie_collect_status' );
 remove_action( 'auth_cookie_bad_hash', 'rest_cookie_collect_status' );
 remove_action( 'auth_cookie_valid', 'rest_cookie_collect_status' );
 remove_filter( 'rest_authentication_errors', 'rest_cookie_check_errors', 100 );

// Отключаем события REST API
 remove_action( 'init', 'rest_api_init' );
 remove_action( 'rest_api_init', 'rest_api_default_filters', 10, 1 );
 remove_action( 'parse_request', 'rest_api_loaded' );

// Отключаем Embeds связанные с REST API
 remove_action( 'rest_api_init', 'wp_oembed_register_route' );
 remove_filter( 'rest_pre_serve_request', '_oembed_rest_pre_serve_request', 10, 4 );

// Отключаем вывод ссылок в header
 remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
 remove_action( 'wp_head', 'wp_oembed_add_host_js' );

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

Ссылки из кода удаляются, а вместо страниц открывается контент с главной.

Для того, чтобы эти страницы не считались дублями домашней, у вас должны быть включены канонические URL на сайте (тег link rel=»canonical»). Со временем все, что Яндекс нашел удалится и ваш сайт снова будет чистым и аккуратным.

Если кто-то может более полно разжевать тему — велком в комментарии, мне будет интересно.