Когда в sitemap начинают попадать служебные страницы, черновые CPT, внутренние таксономии или дубли, это быстро превращается в лишний шум для поисковиков. На небольшом сайте проблема часто незаметна, но на проекте с кастомными типами записей и плагинами SEO карта сайта легко разрастается до набора URL, которые не должны индексироваться вообще.
В WordPress с версии 5.5 есть встроенный XML sitemap. Это удобно, но не всегда достаточно гибко: иногда нужно убрать только один тип записей, скрыть отдельную таксономию или исключить записи по условию. Ниже — рабочие способы сделать это без выдуманных хуков и без вмешательства в ядро.
Когда sitemap нужно чистить
Сначала стоит понять, что именно лишнее. Не каждая страница в карте сайта — ошибка. Но если в ней есть URL, которые не должны участвовать в обходе, лучше убрать их на уровне генерации, а не надеяться на robots.txt или случайный noindex.
Типичные сценарии
- в sitemap попадают служебные CPT вроде
landing,popup,testimonials; - в карту сайта добавлены таксономии с тонким или дублирующимся контентом;
- нужно исключить записи со статусом, меткой или шаблоном, которые не должны индексироваться;
- сайт использует SEO-плагин, и встроенный sitemap WordPress конфликтует с его картой сайта;
- после миграции остались старые типы записей, которые больше не нужны в индексе.
Диагностика проблемы
Перед правкой кода проверьте, кто именно формирует sitemap. В WordPress это может быть встроенный генератор, а может быть карта сайта от SEO-плагина. Если вы отключите не тот слой, ничего не изменится.
Что проверить в первую очередь
- откройте
/wp-sitemap.xmlи посмотрите, какие разделы там есть; - если установлен SEO-плагин, проверьте, не подменяет ли он встроенную карту сайта WordPress;
- сравните список типов записей в
register_post_type()— у некоторых CPT может быть включен'public' => trueи'show_in_rest' => true, но при этом они не должны индексироваться; - посмотрите, нет ли дублей между архивами, страницами и таксономиями.
Если sitemap отдает лишние URL, сначала определите источник. Для встроенной карты сайта WordPress обычно достаточно фильтров ядра. Для SEO-плагинов логика будет другой, и править нужно уже их настройки или хуки.
Как отключить отдельный тип записей из XML sitemap
Для встроенного sitemap WordPress удобнее всего использовать фильтр wp_sitemaps_post_types. Он позволяет убрать конкретный post type из списка, который WordPress публикует в карте сайта.
add_filter( 'wp_sitemaps_post_types', function( $post_types ) {
unset( $post_types['landing'] );
unset( $post_types['popup'] );
return $post_types;
} );Этот код можно добавить в дочернюю тему или в небольшой mu-plugin. Если тип записей нужен на сайте, но не должен попадать в sitemap, это самый прямой вариант.
Как убрать только часть записей внутри типа
Иногда сам post type нужен, но в sitemap должны остаться только опубликованные материалы с определенным условием. Тогда удобнее фильтровать список объектов через wp_sitemaps_posts_query_args. Фильтр работает на уровне запроса, который WordPress использует для построения карты сайта.
add_filter( 'wp_sitemaps_posts_query_args', function( $args, $post_type ) {
if ( 'post' === $post_type ) {
$args['post__not_in'] = array( 123, 456 );
}
if ( 'news' === $post_type ) {
$args['meta_query'] = array(
array(
'key' => '_hide_from_sitemap',
'compare' => 'NOT EXISTS',
),
);
}
return $args;
}, 10, 2 );Такой подход полезен, если у вас есть редакционные флаги или технические записи, которые не должны попадать в индекс, но удалять их из админки нельзя.
Как исключить таксономии и архивы
Для таксономий в WordPress есть отдельный фильтр — wp_sitemaps_taxonomies. Он работает по той же логике: вы убираете из карты сайта ненужные таксономии, а не пытаетесь потом объяснить поисковику, почему они не нужны.
add_filter( 'wp_sitemaps_taxonomies', function( $taxonomies ) {
unset( $taxonomies['post_tag'] );
unset( $taxonomies['internal_topic'] );
return $taxonomies;
} );Если у вас есть архивы таксономий с тонким содержанием, это часто лучшее решение, чем оставлять их в sitemap и потом закрывать через noindex. Карта сайта должна показывать только те URL, которые вы реально хотите продвигать и индексировать.
Сравнение подходов: плагин, код, компромисс
Если сайт обслуживает редактор без доступа к коду, иногда проще использовать настройки SEO-плагина. Но когда нужна точечная логика, код обычно надежнее.
| Подход | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
| Настройки SEO-плагина | Нужно быстро скрыть типы записей без разработки | Просто, видно в админке | Не всегда есть точечная логика по условиям |
| Фильтры WordPress | Нужно убрать конкретный CPT, таксономию или записи по условию | Гибко, прозрачно, без лишних зависимостей | Нужен доступ к коду |
| Комбинированный вариант | Часть правил в плагине, часть в коде | Удобно для больших сайтов | Легко запутаться, если не вести документацию |
Пошаговое решение без лишнего риска
- Определите, какой sitemap используется: встроенный WordPress или SEO-плагин.
- Составьте список лишних post type, таксономий и отдельных записей.
- Добавьте фильтр в дочернюю тему или mu-plugin, а не в основной файл темы.
- Проверьте sitemap в браузере и убедитесь, что нужные разделы исчезли.
- Очистите кеш, если сайт использует серверный кеш, CDN или плагин кеширования.
- Переотправьте sitemap в Google Search Console и Яндекс Вебмастер, если URL-структура изменилась заметно.
Как проверить, что решение сработало
Проверка должна быть не визуальной, а по факту выдачи XML. Откройте /wp-sitemap.xml и нужные вложенные карты, например /wp-sitemap-posts-post-1.xml или аналогичный URL для вашего типа записей. Если раздел исчез, значит фильтр отработал.
Дополнительно проверьте исходный XML на наличие исключенных URL. Удобно искать по названию записи, slug или ID. Если URL все еще есть, значит:
- вы редактируете не тот sitemap;
- SEO-плагин переопределяет встроенную карту сайта;
- кеш отдает старую версию XML;
- фильтр подключен слишком поздно или в неактивной теме.
Если у вас есть доступ к консоли, можно быстро проверить ответ сервера:
curl -I https://example.com/wp-sitemap.xml
curl https://example.com/wp-sitemap.xml | grep -n "landing"Частые ошибки и как их исправить
Убрали URL из sitemap, но он все равно индексируется
Это нормально, если страница уже была в индексе или на нее ведут внутренние ссылки. Sitemap не управляет индексацией напрямую. После удаления URL из карты сайта проверьте, есть ли на странице noindex, canonical и внутренние ссылки на нее.
Правят robots.txt вместо sitemap
Disallow в robots.txt не удаляет URL из индекса автоматически. Если страница уже известна поисковику, она может остаться в результатах без содержимого. Для технической чистки сначала убирают URL из sitemap и внутренних ссылок, затем при необходимости закрывают страницу от индексации.
Фильтр не срабатывает после обновления темы
Если код лежал в теме, обновление могло его перезаписать. Для таких задач безопаснее использовать дочернюю тему или mu-plugin. Это особенно важно, если sitemap настраивается в нескольких местах.
Смешали встроенный sitemap и sitemap от SEO-плагина
Такое бывает после миграции. В итоге в индексе оказываются два набора карт сайта, а поисковик получает противоречивые сигналы. Оставьте один источник sitemap и отключите второй в настройках плагина или через его штатные фильтры.
Безопасность и производительность
Сама настройка sitemap почти не нагружает сайт, но на больших проектах лишние запросы и лишние XML-файлы все равно создают шум. Чем меньше мусора в карте сайта, тем проще поддерживать индексацию и анализировать отчеты в Search Console.
Если вы часто меняете правила исключения, не храните их в произвольных файлах темы. Лучше вынести в небольшой mu-plugin с понятным комментарием. Тогда правило переживет обновление темы и не потеряется при переносе окружений.
Для сайтов, где нужно не только чистить sitemap, но и системно убирать дубли, служебные страницы и лишние элементы интерфейса, иногда удобнее использовать специализированные инструменты вроде Clearfy Pro: https://wpshop.ru/plugins/clearfy?utm_source=wpquery.ru&utm_medium=article&utm_campaign=otkljuchit-xml-sitemap-v-wordpress-dlja-otdelnyh-tipov-zapisej. Но даже в этом случае полезно понимать, какие именно URL и почему исчезают из карты сайта.
Если задача сводится к одному-двум типам записей, код обычно быстрее и прозрачнее. Если же у сайта много исключений, сначала зафиксируйте правила на бумаге, а потом уже переносите их в фильтры WordPress или настройки плагина.