Как отключить открытые XML-feeds в WordPress и убрать лишние ссылки из индекса

Если сайт на WordPress не использует RSS-ленты как канал дистрибуции, открытые /feed/ и связанные с ними URL часто остаются просто техническим шумом. Они не всегда вредят напрямую, но создают лишние точки обхода для краулеров, раздувают индекс и иногда мешают диагностике дублей в Search Console.

Задача здесь не в том, чтобы «сломать все фиды», а в том, чтобы оставить только то, что реально нужно: например, основной RSS для подписки, если он используется, и убрать остальное. Ниже — рабочая схема: как понять, что именно открыто, как отключить ненужные ленты кодом, чем это отличается от плагина и как проверить результат.

Когда это вообще проблема

Сначала стоит убедиться, что речь не о ложной тревоге. На некоторых сайтах RSS действительно нужен: для подписчиков, агрегаторов, внутренних интеграций, автопостинга или email-рассылок. Но если фиды не используются, а в индексе появляются URL вида /feed/, /comments/feed/, /category/.../feed/, это уже технический мусор.

Типичные признаки

  • в Search Console всплывают URL с /feed/ как обнаруженные или проиндексированные;
  • краулер сайта находит десятки или сотни feed-адресов;
  • в логах видны регулярные запросы к RSS, хотя подписчиков нет;
  • на сайте есть категории, теги, авторы и архивы, у каждого из которых WordPress автоматически генерирует feed.

Что не стоит делать

Не надо просто закрывать /feed/ через robots.txt и считать задачу решённой. Это не убирает URL из уже известного индекса и не отключает генерацию на стороне WordPress. Если фид реально не нужен, его лучше отключить на уровне ответа сервера/WordPress, а не маскировать.

Диагностика: какие фиды открыты сейчас

Перед изменениями проверьте, что именно отдаёт сайт. У WordPress есть несколько стандартных точек:

  • /feed/ — общий RSS;
  • /comments/feed/ — лента комментариев;
  • /category/slug/feed/ — фид рубрики;
  • /tag/slug/feed/ — фид метки;
  • /author/name/feed/ — фид автора;
  • /comments/feed/ на уровне записи или страницы.

Проверка простая: откройте URL в браузере или выполните запрос через curl. Если сервер отдаёт XML, значит лента активна.

curl -I https://example.com/feed/
curl -I https://example.com/comments/feed/
curl -I https://example.com/category/news/feed/

Если в ответе видите 200 OK и Content-Type: application/rss+xml или похожий XML-тип, фид доступен. Если это 404 или 410, значит он уже отключён или недоступен.

Как отключить ненужные XML-feeds кодом

Самый предсказуемый способ — добавить небольшой код в дочернюю тему или в собственный мини-плагин. Так вы не зависите от настроек темы и не теряете изменения при обновлении.

Ниже пример, который отключает основные feed-URL и возвращает 404. Это безопаснее, чем просто выводить пустой контент: поисковику и клиентам становится ясно, что ресурса нет.

<?php
add_action('do_feed', 'wpm_disable_feeds', 1);
add_action('do_feed_rdf', 'wpm_disable_feeds', 1);
add_action('do_feed_rss', 'wpm_disable_feeds', 1);
add_action('do_feed_rss2', 'wpm_disable_feeds', 1);
add_action('do_feed_atom', 'wpm_disable_feeds', 1);
add_action('do_feed_rss2_comments', 'wpm_disable_feeds', 1);
add_action('do_feed_atom_comments', 'wpm_disable_feeds', 1);

function wpm_disable_feeds() {
    global $wp_query;

    $wp_query->is_feed = false;
    status_header(404);
    nocache_headers();
    include get_query_template('404');
    exit;
}

Если вам нужно отключить только часть фидов, а основной RSS оставить, не вешайте обработчики на do_feed целиком. Тогда можно точечно убрать, например, комментарии и архивные ленты.

<?php
add_action('do_feed_rss2_comments', 'wpm_disable_feed_404', 1);
add_action('do_feed_atom_comments', 'wpm_disable_feed_404', 1);
add_action('do_feed_rdf', 'wpm_disable_feed_404', 1);

function wpm_disable_feed_404() {
    status_header(404);
    nocache_headers();
    include get_query_template('404');
    exit;
}

Если нужен не 404, а 410

Для удалённых и окончательно ненужных URL иногда логичнее вернуть 410 Gone. Это не обязательное правило, но для технически удалённых фидов такой ответ может ускорить их выведение из индекса. Делайте так только если уверены, что адрес больше не должен существовать.

<?php
function wpm_feed_gone() {
    status_header(410);
    nocache_headers();
    echo 'Gone';
    exit;
}

Плагин или код: что выбрать

Если задача разовая и сайт обслуживает разработчик, код обычно надёжнее. Если нужен быстрый способ без правки темы, можно использовать SEO-плагин или плагин для чистки технических дублей. Но важно понимать компромиссы.

ПодходПлюсыМинусы
Код в дочерней теме / мини-плагинеТочный контроль, минимум лишней логикиНужен доступ к файлам и базовое понимание WordPress
SEO/clean-up плагинБыстро включить, удобно для менеджера сайтаМожет скрывать логику за настройками, иногда отключает больше, чем нужно
robots.txt толькоПросто добавитьНе убирает уже известные URL и не отключает генерацию фида

Если вы уже используете плагин для чистки дублей и технических URL, например Clearfy Pro, проверьте, нет ли там отдельной настройки для RSS/feeds. Но даже в этом случае полезно понимать, что именно делает плагин: редирект, 404 или только скрытие ссылок.

Пошаговое внедрение без поломки нужных подписок

Если на сайте есть хотя бы один внешний потребитель RSS, не отключайте всё сразу. Действуйте по шагам.

  1. Составьте список всех feed-URL, которые реально используются.
  2. Проверьте, есть ли подписчики, интеграции, автопостинг или сторонние сервисы.
  3. Отключите сначала комментарии и архивные фиды, а не основной RSS.
  4. После этого проверьте ответы сервера и поведение в браузере.
  5. Только потом решайте, нужен ли основной /feed/.

Если вы работаете через мини-плагин, его можно оформить совсем коротко. Это удобнее, чем править functions.php активной темы.

<?php
/**
 * Plugin Name: WPM Disable Feeds
 */

if (!defined('ABSPATH')) {
    exit;
}

add_action('do_feed_rss2_comments', 'wpm_disable_feed_404', 1);
add_action('do_feed_atom_comments', 'wpm_disable_feed_404', 1);
add_action('do_feed_rdf', 'wpm_disable_feed_404', 1);

function wpm_disable_feed_404() {
    status_header(404);
    nocache_headers();
    include get_query_template('404');
    exit;
}

Как проверить, что решение сработало

Проверка должна быть не только визуальной. Нужны минимум три точки контроля.

  • HTTP-ответ — curl -I должен показывать 404 или 410 для отключённых URL.
  • Браузер — при открытии feed-адреса не должен отображаться XML-документ.
  • Поисковая консоль — через некоторое время должны перестать появляться новые feed-URL как обнаруженные страницы.

Полезно также прогнать сайт краулером или хотя бы выгрузить список URL из логов за последние дни. Если после внедрения запросы к feed-адресам продолжаются, значит их кто-то реально использует или где-то остались ссылки.

Что смотреть в логах

Ищите повторяющиеся запросы к /feed/, /comments/feed/ и архивным лентам. Если они идут от одного и того же бота, это нормально. Если от вашего же фронтенда или стороннего сервиса — сначала найдите источник, потом отключайте.

Частые ошибки и как их исправить

  • Закрыли фиды в robots.txt, но не отключили их в WordPress. В результате URL всё равно живут, а часть из них уже известна поисковику. Решение: отдавать 404/410 или редиректить только осознанно.
  • Отключили основной RSS, хотя он использовался сервисом рассылки. Проверьте интеграции до правок. Если нужен только один канал, оставьте его открытым.
  • Вставили код в активную тему. После обновления или смены темы изменения исчезнут. Лучше использовать дочернюю тему или мини-плагин.
  • Возвращают 200 с пустым содержимым. Для краулеров это хуже, чем честный 404/410: URL выглядит живым, но бесполезным.
  • Путают feed-URL с sitemap. Карта сайта и RSS — разные вещи. Sitemap отключать не нужно, если он нужен для индексации.

Что ещё стоит проверить после чистки

Когда с feed-URL разобрались, имеет смысл посмотреть соседние технические дубли: архивы автора, меток, дат, вложений, служебные страницы поиска. Обычно именно они создают основную массу мусора в индексе, а фиды — только один из источников.

Если на сайте много технических URL и ручная настройка уже расползается, удобнее собрать это в один слой управления: отключение дублей, чистка служебных страниц, контроль индексации и базовая защита от лишних точек входа. Но даже в таком случае не стоит полагаться только на плагин — важно понимать, какой ответ реально отдаёт сервер и что видит поисковик.

Практический критерий простой: если feed-URL больше не открываются как XML, не участвуют в обходе и не всплывают в отчётах как новые страницы, задача решена. Всё остальное — уже вопрос поддержания порядка в техническом слое сайта.

⭐⭐⭐⭐⭐