Если в XML-карте сайта у вас смешались записи, служебные страницы, CPT для внутренней логики и контент, который не должен попадать в поиск, проблема обычно не в самом sitemap, а в настройках конкретных типов записей. В WordPress карта сайта формируется автоматически, и лишние URL туда попадают так же автоматически — пока вы явно не ограничите вывод.
Типичный сценарий: в индексе начинают светиться страницы фильтров, служебные записи, тестовые CPT, а в Search Console появляются URL, которые вы вообще не планировали продвигать. Вручную чистить sitemap бессмысленно, если источник мусора остаётся в настройках темы, плагина или регистрации post type.
Когда это действительно нужно
Отключать тип записи из XML-карты стоит не «на всякий случай», а когда у него есть понятная причина не участвовать в поиске. Например:
- служебный post type для внутренних данных;
- архивы и одиночные страницы, которые не несут ценности для поиска;
- контент, который дублирует основную структуру сайта;
- черновые или временные сущности, созданные плагином;
- страницы, которые должны быть доступны пользователю, но не нужны в sitemap.
Важно не путать sitemap и индексацию. Если URL не нужен в карте сайта, это ещё не значит, что он автоматически исчезнет из поиска. Для этого отдельно проверяют noindex, каноникал и внутренние ссылки.
Диагностика: откуда именно берётся лишний URL
Сначала нужно понять, кто добавляет проблемный тип записей в sitemap. В WordPress это может быть:
- встроенный XML sitemap ядра;
- SEO-плагин, который перехватывает генерацию карты;
- плагин кастомных типов записей;
- тема, которая регистрирует CPT с неудачными параметрами.
Проверка простая: откройте /wp-sitemap.xml и найдите нужный раздел. Если карта формируется ядром, вы увидите блоки по типам записей и таксономиям. Если используется SEO-плагин, адрес и структура могут отличаться, но логика та же: смотрим, где именно присутствует лишний тип.
Для быстрой проверки в коде полезно посмотреть аргументы регистрации post type. Если тип создаётся через register_post_type(), ищите параметры public, publicly_queryable, show_in_rest, exclude_from_search, has_archive и show_in_sitemap — последний параметр поддерживается не во всех сценариях и зависит от того, кто генерирует sitemap.
Что проверить в первую очередь
- есть ли у типа записи архив и нужен ли он вообще;
- открывается ли одиночная запись по прямой ссылке;
- есть ли внутренние ссылки на этот тип из меню, виджетов, хлебных крошек;
- не создаёт ли его SEO-плагин как отдельный индексируемый раздел;
- не дублируется ли контент через таксономии или шаблоны.
Как отключить тип записи из XML-карты сайта кодом
Если sitemap генерирует ядро WordPress, можно исключить конкретный тип записи через фильтр wp_sitemaps_post_types. Это самый предсказуемый способ: вы не трогаете регистрацию CPT, а только убираете его из карты сайта.
add_filter( 'wp_sitemaps_post_types', function( $post_types ) {
unset( $post_types['service'] );
unset( $post_types['portfolio_item'] );
return $post_types;
} );В примере service и portfolio_item — это реальные с точки зрения WordPress slug'и типов записей. Подставьте свои значения. После этого соответствующий тип исчезнет из XML-карты, но сам контент останется доступным по прямым ссылкам, если вы его не закрывали отдельно.
Если нужно убрать не весь тип, а только отдельные записи, используйте фильтр wp_sitemaps_posts_query_args и исключайте нужные ID или меняйте аргументы запроса. Это уже более точечная настройка, но она требует аккуратности: легко случайно выкинуть из sitemap слишком много контента.
add_filter( 'wp_sitemaps_posts_query_args', function( $args, $post_type ) {
if ( 'post' === $post_type ) {
$args['post__not_in'] = array( 123, 456 );
}
return $args;
}, 10, 2 );Если sitemap делает SEO-плагин
У популярных SEO-плагинов логика может отличаться от ядра. В таком случае правильнее отключать тип записи в настройках самого плагина, а не пытаться перехватывать генерацию на уровне WordPress. Иначе получите конфликт: в одном месте тип скрыт, в другом — снова появляется.
Практически это выглядит так: находите раздел XML sitemap в настройках плагина, открываете список post type и снимаете галочку с ненужного типа. После сохранения проверьте не только sitemap, но и robots.txt, если плагин добавляет туда ссылки на карту автоматически.
| Способ | Когда подходит | Плюс | Минус |
|---|---|---|---|
| Код через фильтр WordPress | Встроенный sitemap ядра | Точечно и прозрачно | Нужно править код |
| Настройки SEO-плагина | Sitemap генерирует плагин | Без кода | Зависит от интерфейса плагина |
| Отключение регистрации CPT | Тип записи не нужен вообще | Убирает источник проблемы | Может сломать шаблоны и ссылки |
Пошаговое решение без лишнего риска
- Определите, кто генерирует sitemap: ядро WordPress или SEO-плагин.
- Найдите точный slug типа записи, который нужно убрать.
- Решите, нужен ли этот тип пользователю по прямой ссылке.
- Если тип нужен, исключайте его только из sitemap.
- Если тип не нужен совсем, отключайте его регистрацию или переводите в
noindexи убирайте внутренние ссылки. - После правки очистите кеш сайта и кеш CDN, если он есть.
- Проверьте sitemap и статус URL в Search Console.
Как проверить, что решение сработало
Проверка должна быть не «страница открылась», а именно по цепочке индексации и генерации карты.
- Откройте
/wp-sitemap.xmlи убедитесь, что лишнего типа там больше нет. - Если используется SEO-плагин, проверьте его sitemap-URL отдельно.
- Посмотрите исходный код страницы sitemap и убедитесь, что ссылки на ненужный тип исчезли.
- В Search Console отправьте sitemap на повторную обработку и проверьте отчёт по страницам.
- Если URL уже был в индексе, отслеживайте его статус отдельно: удаление из sitemap не всегда даёт мгновенный эффект.
Если после правки тип всё ещё появляется, почти всегда причина одна из трёх: кеш, второй генератор sitemap или неверный slug post type.
Частые ошибки и как их исправить
Отключили тип из sitemap, но он остался в поиске
Это нормально. Sitemap — не кнопка удаления из индекса. Если URL уже известен поисковику, дополнительно проверьте noindex, канонический URL и внутренние ссылки. Иногда нужно ещё убрать страницы из меню и блоков, чтобы не подкармливать обход.
Сломали sitemap, потому что удалили не тот ключ
В фильтре нужно указывать именно slug типа записи, а не его название в админке. Например, визуально это может быть «Портфолио», а в коде — portfolio_item. Если сомневаетесь, посмотрите регистрацию CPT в теме или плагине.
Отключили тип в одном месте, а он вернулся после обновления
Так бывает, если правка была сделана в файлах темы, а сам тип регистрирует плагин. После обновления тема не поможет. Надёжнее переносить логику в дочернюю тему или мини-плагин, который не затрётся обновлением.
Убрали тип из sitemap, но оставили тяжёлые архивы открытыми
Если архив типа всё равно доступен и не нужен, его лучше закрыть отдельно. Иначе поисковик продолжит обходить его как обычную страницу, даже без ссылки из карты сайта.
Практика по безопасности и производительности
Любые правки sitemap и регистрации post type лучше держать в отдельном мини-плагине или в дочерней теме, а не в functions.php основной темы. Это снижает риск потерять настройку после обновления и упрощает откат.
Если на сайте много кастомных типов записей, не делайте «глобальные» исключения без проверки. Иногда тип нужен не для SEO, а для внутренней навигации, REST API или интеграции с другим плагином. В таком случае безопаснее скрыть его только из sitemap и отдельно закрыть от индексации, если это действительно требуется.
Для сайтов с большим количеством URL полезно после изменений проверить нагрузку на генерацию sitemap. Если карта строится медленно, это уже повод смотреть на кеширование, количество записей в одном типе и лишние запросы в шаблонах.
Если нужен более широкий аудит дублей, служебных страниц и мусорных URL, удобно сочетать точечные правки с инструментами вроде Clearfy Pro — но только как вспомогательный слой, а не замену понимания, что именно вы отключаете.