Как отключить XML-sitemaps для отдельных типов записей в WordPress

Ситуация типичная: сайт уже живёт, контент разрастается, а в XML-карте появляются таксономии, служебные записи или custom post types, которые не должны попадать в поиск. Полностью отключать sitemap не хочется, потому что он нужен для обычных страниц и записей. В этом случае задача не в том, чтобы «выключить карту сайта», а в том, чтобы точечно убрать лишние типы контента.

Ниже разберём, как понять, что именно мешает, какие есть рабочие способы в WordPress и как проверить, что после правки sitemap действительно стал чище.

Когда это нужно и как выглядит проблема

Чаще всего лишние URL в XML-sitemap появляются в таких сценариях:

  • в теме или плагине зарегистрирован custom post type для служебных материалов, но он не должен индексироваться;
  • в sitemap попадают вложения, архивы или записи, которые дублируют основной контент;
  • на сайте есть отдельные типы записей для внутреннего использования: отзывы, лог событий, временные страницы;
  • SEO-плагин автоматически добавляет в карту всё, что помечено как публичное, хотя это не всегда нужно.

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

Диагностика: что именно попадает в sitemap

Сначала нужно понять, кто формирует карту сайта. В WordPress это может быть встроенный механизм ядра, SEO-плагин или кастомный код темы. Проверка простая:

  1. Откройте /wp-sitemap.xml в браузере, если используете встроенные sitemap WordPress.
  2. Если стоит SEO-плагин, проверьте его собственный sitemap-индекс, например /sitemap_index.xml.
  3. Посмотрите, какие разделы карты содержат лишние URL: записи, страницы, авторы, категории, custom post types.
  4. Сравните это с тем, что реально должно индексироваться.

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

Что проверить в настройках типа записи

Для custom post type важны параметры public, publicly_queryable, show_ui и exclude_from_search. Но для sitemap ключевой момент — поддерживает ли тип запись в карте сайта вообще. В современных версиях WordPress встроенный sitemap учитывает публичные типы, если они не исключены фильтрами. SEO-плагины могут вести себя по-своему, поэтому важно смотреть не только регистрацию типа, но и конкретный генератор карты.

Способы решения: плагин, код или настройка CPT

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

ПодходКогда подходитМинус
Настройки SEO-плагинаЕсли sitemap генерирует Yoast, Rank Math или другой SEO-плагинНе всегда есть точечный контроль по типам
Код через фильтры WordPressЕсли нужен точный контроль без лишних зависимостейНужно аккуратно обновлять тему или mu-plugin
Правка регистрации CPTЕсли тип записей создаёте самиМеняет поведение не только sitemap, но и админки/поиска

Вариант 1: убрать тип записи из встроенного sitemap WordPress

Если используется встроенный механизм WordPress, можно отключить конкретный post type через фильтр wp_sitemaps_post_types. Это самый прямой способ, когда нужно убрать, например, служебный тип internal_note или review_draft.

<?php
add_filter( 'wp_sitemaps_post_types', function( $post_types ) {
    unset( $post_types['internal_note'] );
    unset( $post_types['review_draft'] );

    return $post_types;
} );

Код лучше размещать в дочерней теме, в небольшом mu-plugin или в отдельном функциональном плагине. Не стоит вшивать такую правку в файл темы, если тема может обновляться и вы не контролируете её жизненный цикл.

Вариант 2: отключить тип записи в SEO-плагине

Если sitemap генерирует SEO-плагин, сначала ищите настройку в интерфейсе. Обычно там есть список типов контента, которые можно включать или выключать для карты сайта. Это предпочтительнее кода, если сайт поддерживает редактор неразработчик и структура меняется редко.

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

Вариант 3: исключить тип записи на уровне регистрации

Если custom post type создаётся в вашем коде, можно сразу задать поведение так, чтобы он не попадал в sitemap и не светился там, где не нужно. Для встроенного sitemap WordPress этого обычно недостаточно само по себе, но для общей архитектуры это полезно.

<?php
register_post_type( 'internal_note', array(
    'label'              => 'Internal notes',
    'public'             => false,
    'show_ui'            => true,
    'show_in_menu'       => true,
    'exclude_from_search' => true,
    'publicly_queryable' => false,
    'has_archive'        => false,
    'rewrite'            => false,
    'show_in_rest'       => false,
) );

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

Пошаговое решение без лишнего риска

  1. Определите, какой sitemap используется: встроенный WordPress или sitemap SEO-плагина.
  2. Составьте список типов записей, которые не должны индексироваться.
  3. Проверьте, есть ли для них настройка в интерфейсе плагина.
  4. Если настройки нет, добавьте точечный фильтр в mu-plugin или дочернюю тему.
  5. После правки очистите кэш, если на сайте есть page cache или CDN.
  6. Переоткройте sitemap и убедитесь, что лишний блок исчез.

Если вы работаете с production-сайтом, лучше сначала внести изменение на staging-окружении. Это особенно важно, если sitemap генерируется плагином, который может кешировать свой индекс или пересобирать его не сразу.

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

Проверка должна быть не «на глаз», а по конкретным признакам:

  • в sitemap больше нет блока с исключённым типом записи;
  • URL этого типа не появляются в XML-индексе карты сайта;
  • при открытии старого URL sitemap возвращает актуальную структуру, а не закешированную версию;
  • в Search Console или аналогичном инструменте новые исключённые URL больше не подаются через sitemap.

Если изменения не видны сразу, проверьте кэш на уровне плагина, сервера и CDN. Иногда sitemap отдаётся как статический файл или как закешированный ответ, и тогда правка в коде уже работает, но вы видите старую версию.

Быстрая техническая проверка

Можно открыть sitemap в терминале и посмотреть, исчез ли нужный блок:

curl -s https://example.com/wp-sitemap.xml | grep -n "internal_note"

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

Частые ошибки и почему они возникают

  • Отключили не тот sitemap. Часто правят встроенный WordPress sitemap, а на сайте фактически работает SEO-плагин со своей картой.
  • Скрыли тип записи только в админке. Параметр show_ui не влияет на sitemap напрямую.
  • Удалили URL из sitemap, но не закрыли сам тип от индексации. Если URL доступен и связан из других страниц, он всё равно может попасть в индекс.
  • Забыли про кэш. После правки карта сайта продолжает отдавать старую версию, и кажется, что фильтр не работает.
  • Использовали несуществующий фильтр. Это случается, когда код копируют из чужой статьи без проверки версии WordPress или конкретного плагина.

Безопасность и производительность

Если вы добавляете фильтр кодом, не правьте ядро и не вносите изменения напрямую в файлы плагина. Для таких задач лучше подходит mu-plugin: он не зависит от темы и не слетает при обновлении. Это особенно удобно, если на проекте несколько разработчиков и нужно хранить технические правки отдельно от дизайна.

С точки зрения производительности сам фильтр почти ничего не стоит. Реальная нагрузка появляется не от кода, а от лишних URL в sitemap и от того, как часто поисковый робот тратит время на мусорные разделы. Поэтому точечное исключение лишних типов записей — это не косметика, а нормальная техническая гигиена.

Если вам нужно регулярно чистить сайт от дублей, служебных страниц и лишних технических сущностей, имеет смысл держать рядом набор инструментов для SEO-оптимизации и очистки разметки. Например, для части таких задач на практике используют Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но даже с плагином полезно понимать, какой именно URL вы убираете и почему.

Что делать, если тип записи нужен в админке, но не нужен в sitemap

Это нормальный сценарий для внутренних материалов, черновых карточек, служебных записей и контента для редакторов. В таком случае не надо ломать весь тип записи. Достаточно оставить его доступным в админке, но исключить из sitemap и, при необходимости, закрыть от поиска и публичного просмотра.

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

Если после внедрения всё ещё видите лишние URL в индексе, проверьте не только sitemap, но и внутренние ссылки, хлебные крошки, архивы и блоки «похожие материалы». Sitemap — это источник рекомендаций для поисковика, но не единственный путь к индексации.

⭐⭐⭐⭐⭐