Ситуация типичная: сайт уже живёт, контент разрастается, а в XML-карте появляются таксономии, служебные записи или custom post types, которые не должны попадать в поиск. Полностью отключать sitemap не хочется, потому что он нужен для обычных страниц и записей. В этом случае задача не в том, чтобы «выключить карту сайта», а в том, чтобы точечно убрать лишние типы контента.
Ниже разберём, как понять, что именно мешает, какие есть рабочие способы в WordPress и как проверить, что после правки sitemap действительно стал чище.
Когда это нужно и как выглядит проблема
Чаще всего лишние URL в XML-sitemap появляются в таких сценариях:
- в теме или плагине зарегистрирован custom post type для служебных материалов, но он не должен индексироваться;
- в sitemap попадают вложения, архивы или записи, которые дублируют основной контент;
- на сайте есть отдельные типы записей для внутреннего использования: отзывы, лог событий, временные страницы;
- SEO-плагин автоматически добавляет в карту всё, что помечено как публичное, хотя это не всегда нужно.
Проблема не только в лишнем шуме. Если поисковик регулярно обходит мусорные URL, это расходует crawl budget и усложняет контроль индексации. На небольшом сайте это заметно не сразу, но на проекте с большим количеством типов контента лишние ссылки в sitemap быстро превращаются в технический долг.
Диагностика: что именно попадает в sitemap
Сначала нужно понять, кто формирует карту сайта. В WordPress это может быть встроенный механизм ядра, SEO-плагин или кастомный код темы. Проверка простая:
- Откройте
/wp-sitemap.xmlв браузере, если используете встроенные sitemap WordPress. - Если стоит SEO-плагин, проверьте его собственный sitemap-индекс, например
/sitemap_index.xml. - Посмотрите, какие разделы карты содержат лишние URL: записи, страницы, авторы, категории, custom post types.
- Сравните это с тем, что реально должно индексироваться.
Если в 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 по своей логике.
Пошаговое решение без лишнего риска
- Определите, какой sitemap используется: встроенный WordPress или sitemap SEO-плагина.
- Составьте список типов записей, которые не должны индексироваться.
- Проверьте, есть ли для них настройка в интерфейсе плагина.
- Если настройки нет, добавьте точечный фильтр в mu-plugin или дочернюю тему.
- После правки очистите кэш, если на сайте есть page cache или CDN.
- Переоткройте 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 — это источник рекомендаций для поисковика, но не единственный путь к индексации.