Иногда sitemap в WordPress начинает тянуть в индекс то, что там не должно быть: служебные записи, внутренние типы контента, черновые структуры под фильтры, архивы с пустой ценностью для поиска. Если просто удалить страницу из меню или закрыть её robots.txt, это не решает задачу. Нужен точечный контроль именно над XML sitemap.
Когда это действительно проблема
Сценарий обычно выглядит одинаково: в Search Console появляются URL из нецелевых типов записей, в sitemap.xml видны лишние разделы, а после публикации новых материалов поисковик начинает обходить технические страницы вместо полезных. Это особенно заметно, если на сайте есть custom post types, которые создавались для внутренней логики темы или плагина.
Проверять нужно не только сам файл sitemap, но и то, как WordPress формирует его по типам записей. В ядре с версии 5.5 используется встроенная XML-карта сайта, и она автоматически включает публичные post types, если у них не отключена поддержка sitemap.
Что именно стоит исключать
- служебные custom post types без SEO-ценности;
- внутренние записи для шаблонов, блоков, логов, интеграций;
- архивные типы контента, которые дублируют другие страницы;
- контент, который должен быть доступен только по прямой ссылке, но не через карту сайта.
Диагностика: где WordPress берет эти URL
Сначала проверьте, какой sitemap у вас используется: встроенный WordPress или генератор от SEO-плагина. Если карта сайта от плагина, логика исключения может отличаться. Если используется ядро, ориентируйтесь на фильтры WordPress и настройки самого post type.
Для встроенного sitemap откройте /wp-sitemap.xml и посмотрите, какие разделы там перечислены. Если лишний тип записей уже есть в индексе карты сайта, значит он зарегистрирован как публичный и попадает в sitemap по умолчанию.
Полезно также проверить регистрацию типа записей в коде темы или плагина. Ищите параметры public, show_ui, publicly_queryable и show_in_rest. Для sitemap важнее всего именно публичность типа.
Рабочие способы убрать тип записей из sitemap
Есть три нормальных подхода: через регистрацию post type, через фильтр sitemap, либо через настройки SEO-плагина. Выбор зависит от того, где у вас живет логика контента.
| Способ | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
| Изменить регистрацию post type | Тип записей создаете сами | Чистое решение на уровне кода | Нужно править плагин или тему, где объявлен CPT |
Фильтр wp_sitemaps_post_types | Нужно убрать тип из встроенного sitemap | Не трогает сам post type | Работает только для ядра WordPress sitemap |
| Настройки SEO-плагина | Карта сайта генерируется плагином | Без кода, если опция есть | Зависит от конкретного плагина |
Вариант 1: убрать тип записей через фильтр WordPress
Если вы используете встроенный sitemap WordPress, добавьте фильтр в functions.php дочерней темы или в небольшой mu-plugin. Так вы исключите конкретный тип записей из карты сайта, не меняя его доступность на сайте.
<?php
add_filter('wp_sitemaps_post_types', function( $post_types ) {
unset( $post_types['service_log'] );
unset( $post_types['internal_note'] );
return $post_types;
});Здесь service_log и internal_note — примеры slug типа записей. Подставляйте свои значения, которые используются в register_post_type().
Вариант 2: отключить sitemap у конкретного CPT при регистрации
Если тип записей создается вашим кодом, лучше сразу задать ему show_in_sitemap в false. Это более явный и читаемый способ, чем последующее исключение фильтром.
<?php
register_post_type('service_log', array(
'label' => 'Service logs',
'public' => false,
'show_ui' => true,
'show_in_rest' => true,
'show_in_sitemap' => false,
'supports' => array('title', 'editor'),
));Важно: show_in_sitemap имеет смысл именно для встроенной карты сайта WordPress. Если sitemap генерирует SEO-плагин, он может игнорировать этот параметр и использовать свои настройки.
Вариант 3: если sitemap делает SEO-плагин
У плагинов логика обычно своя. В таком случае сначала ищите настройку исключения post type из XML sitemap в интерфейсе. Если её нет, придется смотреть документацию конкретного плагина. Универсального фильтра на все случаи здесь нет, и придумывать его не стоит.
Если вы используете Clearfy Pro, имеет смысл проверить, не дублируется ли у вас управление sitemap через несколько инструментов сразу. Когда один плагин генерирует карту сайта, а другой пытается ее править, результат часто становится непредсказуемым. В таких конфигурациях лучше оставить один источник sitemap.
Пошаговое решение без лишнего риска
- Определите, кто генерирует sitemap: ядро WordPress или SEO-плагин.
- Найдите slug проблемного типа записей в
register_post_type()или в настройках плагина. - Исключите тип через
show_in_sitemap => falseили фильтрwp_sitemaps_post_types. - Очистите кеш, если sitemap кэшируется на уровне плагина, сервера или CDN.
- Проверьте итоговый XML вручную и через Search Console.
Как проверить, что все сработало
После правки откройте /wp-sitemap.xml и убедитесь, что раздел с нужным типом записей исчез. Если карта сайта разбита на несколько файлов, проверьте и индексный sitemap, и дочерние XML-файлы.
Дальше проверьте исходный код страницы sitemap и убедитесь, что в ней больше нет ссылок на исключенный тип записей. Если URL все еще присутствуют, значит:
- изменение внесено не в тот sitemap-генератор;
- не сброшен кеш;
- тип записей добавляет в карту не WordPress, а SEO-плагин или отдельный модуль.
Дополнительно можно проверить ответ сервера через curl:
curl -I https://example.com/wp-sitemap.xmlЕсли вы меняли код, а в ответе видите старую версию файла, значит проблема в кешировании, а не в логике исключения.
Частые ошибки и как их исправить
Удалили URL из sitemap, но он все равно индексируется
Это нормально: исключение из sitemap не удаляет страницу из индекса мгновенно. Если URL уже известен поисковику, он может оставаться в выдаче до следующего обхода. Для таких страниц нужно отдельно решить вопрос с noindex, редиректом или удалением контента.
Поменяли public на false и сломали админку
Если тип записей нужен в админке, не трогайте публичность без понимания последствий. Для исключения из sitemap обычно достаточно show_in_sitemap => false или фильтра. Полное отключение публичности может повлиять на REST API, шаблоны и связанные запросы.
Правили не тот слой
Частая ошибка — менять код в теме, хотя post type зарегистрирован плагином. После обновления темы правка исчезнет, а проблема вернется. Если тип записей живет в плагине, лучше использовать отдельный mu-plugin или дочернюю тему, если это действительно ваш код.
Оставили два генератора sitemap одновременно
Когда активны и ядро WordPress, и SEO-плагин, и еще один модуль карты сайта, легко получить дубли или конфликтующие URL. В такой схеме сначала определите единственный источник sitemap, а остальные отключите.
Практические советы по безопасности и производительности
Если вы вносите правки в код, не редактируйте файлы напрямую на боевом сайте. Используйте staging или хотя бы резервную копию. Для небольших точечных изменений удобнее создать mu-plugin: он не зависит от темы и не потеряется при обновлении.
Еще один момент — кеш. После изменения sitemap очищайте не только плагин кеша, но и серверный кеш, если он есть. Иначе вы будете проверять не актуальный XML, а старую копию.
Если задача повторяется на нескольких проектах, вынесите исключения в отдельный мини-плагин с понятным списком типов записей. Так проще сопровождать сайт и быстрее понимать, почему конкретный тип не попадает в индексную карту.
<?php
/**
* Plugin Name: Sitemap post type exclusions
*/
add_filter('wp_sitemaps_post_types', function( $post_types ) {
$exclude = array('service_log', 'internal_note');
foreach ( $exclude as $post_type ) {
unset( $post_types[ $post_type ] );
}
return $post_types;
});Такой подход проще сопровождать, чем разбрасывать правки по теме и нескольким плагинам. Если вам нужно больше точечных SEO-правок без ручной возни, можно посмотреть на Clearfy Pro: https://wpshop.ru/plugins/clearfy.
Что делать, если нужен не полный запрет, а частичное исключение
Иногда нужно убрать из sitemap не весь тип записей, а только отдельные записи. Для встроенного sitemap это уже другой сценарий: фильтр по типам тут не поможет, потому что он работает на уровне post type целиком. В таком случае смотрите в сторону фильтров уровня URL или используйте SEO-плагин, который умеет исключать конкретные записи из карты сайта.
Если задача связана с контентом, который должен существовать на сайте, но не участвовать в поисковой индексации, лучше разделять два уровня: наличие в sitemap и индексация. Это разные механизмы, и путать их не стоит.