Когда в XML sitemap попадают служебные записи, черновые типы контента, архивы плагинов или страницы, которые не должны индексироваться, поисковик получает лишний шум. На небольшом сайте это выглядит как мелочь, но на практике именно такие URL часто засоряют карту сайта и мешают быстрее обрабатывать нужные страницы.
Задача здесь не в том, чтобы «выключить sitemap целиком», а в том, чтобы точечно убрать из него лишние типы записей и при этом не сломать остальную индексацию. Ниже — рабочие способы для WordPress: через код, через фильтры и с проверкой результата.
Когда это действительно нужно
Сначала стоит убедиться, что проблема именно в sitemap, а не в robots.txt, noindex или дублирующих архивах. XML-карта сама по себе не заставляет страницу индексироваться, но она подсказывает поисковику, что URL важен. Если туда попадает мусор, вы тратите краулинговый бюджет и усложняете диагностику.
Типичные сценарии
- в sitemap есть записи кастомного типа, которые используются только внутри админки;
- в карту попадают страницы плагина, которые не должны индексироваться;
- нужно скрыть отдельный тип контента до запуска проекта;
- сайт использует несколько CPT, но индексировать нужно только часть из них.
Если у вас уже есть проблема с дублями категорий или поисковыми страницами, сначала решите её отдельно. Убирать URL из sitemap имеет смысл только после того, как вы понимаете, какие именно страницы должны остаться в индексе.
Диагностика: что именно попало в XML sitemap
В WordPress с 5.5 встроена генерация XML sitemap. Проверять нужно не только главную карту /wp-sitemap.xml, но и вложенные карты типов записей. Откройте карту и посмотрите, какие разделы там есть: posts, pages, custom post types, taxonomies.
Если сайт использует SEO-плагин, встроенная карта WordPress может быть отключена или заменена. Тогда логика будет зависеть от конкретного плагина. Но в этой статье мы разбираем именно штатный механизм WordPress и фильтры ядра.
Быстрая проверка через браузер или curl:
curl -I https://example.com/wp-sitemap.xmlЕсли карта открывается, дальше смотрите её содержимое и ищите лишние разделы. Для CPT обычно проблема видна сразу: есть отдельный sitemap для типа записей, который вы не хотите отдавать поисковику.
Как отключить отдельный тип записей из sitemap
Самый чистый способ — убрать нужный post type из карты через фильтр wp_sitemaps_post_types. Это штатный хук WordPress, он не требует сторонних библиотек и работает предсказуемо.
Пример: исключаем тип записей internal_note из XML sitemap.
add_filter( 'wp_sitemaps_post_types', function( $post_types ) {
unset( $post_types['internal_note'] );
return $post_types;
} );Такой код можно добавить в functions.php дочерней темы, но на практике лучше вынести его в небольшой mu-plugin, чтобы он не потерялся при смене темы.
Вариант через mu-plugin
Создайте файл wp-content/mu-plugins/disable-sitemap-post-type.php и положите туда код:
<?php
add_filter( 'wp_sitemaps_post_types', function( $post_types ) {
unset( $post_types['internal_note'] );
return $post_types;
} );Если у вас несколько типов записей, можно убрать сразу все лишние:
add_filter( 'wp_sitemaps_post_types', function( $post_types ) {
$exclude = array( 'internal_note', 'landing_draft', 'partner_page' );
foreach ( $exclude as $post_type ) {
if ( isset( $post_types[ $post_type ] ) ) {
unset( $post_types[ $post_type ] );
}
}
return $post_types;
} );Если нужно убрать только часть записей, а не весь тип
Иногда post type полезен сам по себе, но в sitemap не должны попадать отдельные записи: например, служебные материалы, тестовые страницы или контент с нестабильным статусом. В этом случае фильтр wp_sitemaps_posts_query_args позволяет изменить запрос к выборке URL.
Допустим, у записей есть мета-поле _hide_from_sitemap со значением 1. Тогда можно исключить такие записи из карты сайта:
add_filter( 'wp_sitemaps_posts_query_args', function( $args, $post_type ) {
if ( 'post' !== $post_type ) {
return $args;
}
$args['meta_query'] = array(
array(
'key' => '_hide_from_sitemap',
'compare' => 'NOT EXISTS',
),
);
return $args;
}, 10, 2 );Это уже более точечный сценарий, но здесь важно не переусложнить логику. Если вам нужно скрывать записи по нескольким признакам, проверьте, не проще ли вообще не включать этот тип в sitemap и отдельно управлять индексацией через мета-теги и robots.
Сравнение подходов
| Подход | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
Фильтр wp_sitemaps_post_types | Нужно убрать целый тип записей | Просто, прозрачно, штатный механизм | Не подходит для точечного исключения отдельных постов |
Фильтр wp_sitemaps_posts_query_args | Нужно скрыть часть записей внутри типа | Гибко, можно завязать на мета-поля | Нужно аккуратно проектировать логику выборки |
| SEO-плагин | Карта сайта уже управляется плагином | Удобно для редакторов | Зависит от конкретного плагина и его настроек |
Проверка результата после внедрения
После изменения кода не ограничивайтесь открытием главной карты. Проверять нужно именно те вложенные sitemap, которые раньше содержали лишние URL.
- откройте
/wp-sitemap.xmlи убедитесь, что раздел исчез; - проверьте HTTP-ответ нужного sitemap через
curl -I; - посмотрите исходный XML и убедитесь, что URL больше не выводятся;
- если используется кэш, очистите его на уровне плагина и сервера;
- в Search Console отправьте карту заново, если она уже была добавлена.
Пример проверки конкретного URL в sitemap:
curl -s https://example.com/wp-sitemap-posts-post-1.xml | grep -n "test-post"Если grep ничего не возвращает, но URL всё ещё виден в браузере, почти наверняка вы смотрите закэшированную версию. Тогда сначала очищайте page cache, object cache и CDN, а уже потом повторяйте проверку.
Частые ошибки и как их исправить
Отключили не тот тип записей
В WordPress slug post type и его название в коде — это не всегда то, что видно в админке. Проверьте регистрацию типа записей: именно ключ, который передан в register_post_type(), нужно использовать в фильтре.
Код добавили в тему, а потом потеряли при обновлении
Если решение критичное для SEO, не держите его в обычной теме. Используйте дочернюю тему или mu-plugin. Для точечных технических правок mu-plugin обычно надёжнее.
Сайт использует SEO-плагин, а вы правите встроенный sitemap
Если плагин уже подменяет карту сайта, фильтры ядра могут не дать ожидаемого эффекта. В таком случае сначала проверьте, кто именно генерирует XML. Иногда проще отключить встроенную карту WordPress и управлять sitemap средствами одного плагина, чем смешивать два механизма.
Удалили URL из sitemap, но они всё равно индексируются
Это нормальная ситуация. Удаление из карты сайта не равно удалению из индекса. Если страница должна исчезнуть из поиска, дополнительно проверьте noindex, каноникал, внутренние ссылки и статус ответа сервера.
Безопасность и производительность
Сам фильтр sitemap почти не нагружает сайт, если вы не добавляете тяжёлые запросы в логику исключений. Опасность обычно не в коде, а в том, что его начинают усложнять: тянут мета-запросы, проверяют роли пользователей, делают лишние обращения к базе на каждом запросе.
Практически полезные правила:
- не используйте сложные SQL-обходы, если достаточно убрать целый post type;
- не завязывайте sitemap на данные, которые часто меняются без необходимости;
- не храните технические исключения в произвольных опциях без документации;
- после правки проверяйте карту в кэше и без кэша;
- если правите через плагин, убедитесь, что он не конфликтует с SEO-плагином.
Если вам нужно не только убрать дубли и лишние URL, но и навести порядок в технических настройках сайта, удобно делать это через один набор инструментов, а не разрозненные сниппеты. Например, у Clearfy Pro есть набор функций для чистки и SEO-настроек: https://wpshop.ru/plugins/clearfy?utm_source=wpdeveloper.ru&utm_medium=article&utm_campaign=otklyuchit-xml-sitemap-dlya-otdelnyh-tipov-zapisei-wordpress.
Главная идея простая: сначала определите, какой именно контент лишний в sitemap, затем выберите самый короткий способ исключения. Для целого типа записей достаточно одного фильтра. Для отдельных материалов — аккуратной логики в запросе. После этого обязательно проверьте XML руками и через curl, а не только по ощущениям из админки.