Последнее обновлене - 18 февраля 2023 в 12:53
Ну что ж, решение принято, и я возвращаю в работу REST API, который безжалостно был ликвидирован мной ещё на начальном этапе оптимизации этого сайта. Отключение функционала REST API было обусловлено тем, что после очередного обновления WordPress (версия 4.7, если не ошибаюсь), в выдаче Яндекса начали появляться технические страницы вида https://название сайта/wp-json.
В связи с этим, многие вебмастера отметили резкое увеличение числа мусорных страниц в выдаче поисковой системы и проседание посещаемости, в результате появления дублированного контента. Почти сразу в Интернете по сайтам начал «ходить» код, который решил эту проблему радикально — отключением REST API. В результате, генерация дублей прекращалась, и мусорные страницы постепенно выпадали из индекса Яндекса.
Чтобы отключить REST API в WordPress, было предложено дополнить файл functions.php рабочей темы таким кодом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
/* Отключение WP-json */ // Отключаем сам 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 ); remove_action( 'wp_head', 'wp_oembed_add_discovery_links' ); // если собираетесь выводить вставки из других сайтов на своем, то закомментируйте след. строку. remove_action( 'wp_head', 'wp_oembed_add_host_js' ); // Редирект с wp-json на главную add_action( 'template_redirect', function() { if ( preg_match( '#^/wp-json/(.*)#', $_SERVER['REQUEST_URI'] ) ) { wp_redirect( get_option( 'siteurl' ), 301 ); die(); } } ); |
Этот код можно встретить на десятках или сотнях сайтов, посвящённых работе с WordPress. В общем, ликованию вебмастеров, и моему тоже, не было предела, ведь внезапно возникшая головная боль была снята.
Однако, такой бонус в виде отсутствия в выдаче не имеющих отношения к полезному контенту технических страниц стал платой за снижение некоторой функциональности WordPress при отключенном REST API. Ведь этот самый REST API обеспечивает взаимодействие WordPress с внешним программным обеспечением.
Первое неудобство в связи с блокировкой REST API я ощутил, когда не смог воспользоваться плагином комментирования. Пережить эту неприятность можно, конечно. Но за этим ограничением последовали и другие — многие полезные плагины после их установки и активации, попросту отказывались корректно работать. Кроме того, не получится работать с новым блочным редактором Гутенберг при отключенном REST API.
Инструмент «Здоровье сайта» указывает на не корректную работу REST API.
К слову говоря, сообщество вебмастеров разделилось относительно необходимости использования такой полезной штуковины, как REST API. Одни утверждают, что это зло, от которого следует как можно скорее избавиться при работе с сайтом (блогом). Другие же напортив, топят за безусловное использование REST API. При этом, рекомендуют закрывать от индексации wp-json и embed в файле robots.txt. Третьи вообще рекомендуют убрать руки прочь от REST API и даже не запрещать ничего в robots.txt, поскольку индексироваться мусор и так не будет.
На сегодняшний день, вышеуказанный код у меня работает. Когда я зашёл в раздел «Структура сайта» Вебмастера, то wp-json среди страниц в поиске, к счастью, не обнаружил. Однако, среди загруженных страниц, этого «добра» предостаточно.
Поскольку в дальнейшем не хотелось бы ограничивать работу сайта из-за отключенного REST API, с сегодняшнего дня восстанавливаю данный функционал. Чтобы восстановить работу REST API, необходимо перейти в настройки постоянных ссылок в административной панели сайта и просто кликнуть по кнопке «Сохранить изменения» внизу страницы. Посмотрим, что изменилось с wp-json спустя несколько обновлений WordPress. Экспериментальная часть будет заключаться в следующем:
- Комментирую в functions.php код, блокирующий работу REST API.
- Не вношу никакие изменения в файл robots.txt.
- Через 1-2 апдейта поисковой системы Яндекс проверяю раздел «Страницы в поиске».
- В случае обнаружения в поиске wp-json, запрещаю в robots.txt и наблюдаю ситуацию ещё через 1-2 апдейта.
Как раз, сегодня Вебмастер проинформировал меня об обновлении данных в поисковой базе Яндекса по сайту hoboweb.ru.
Как запретить индексацию wp-json? Один из вариантов — сделать запись в robots.txt:
User-agent: *
Disallow: /wp-json/
Disallow: */embed
Все изменения, связанные с wp-json, буду фиксировать в этой записи. Кстати, посмотрите, как создать правильный robots.txt для WordPress.
Я не стала удалять REST API. Всё работает прекрасно.