Ситуация типовая: в WordPress есть отдельный тип записей, который нужен на сайте, но не должен попадать в XML sitemap. Это может быть служебный контент, внутренние страницы, тестовые записи, архивы с тонким содержимым или CPT, который вообще не должен участвовать в поисковом обходе. Если просто выключить всё через плагин или удалить URL вручную, легко задеть индексацию нужных страниц.
Ниже — рабочие способы: через настройки SEO-плагина, через код и через проверку результата. Разберёмся, когда достаточно интерфейса, а когда лучше править регистрацию типа записей или фильтры генератора карты сайта.
Когда проблема действительно в sitemap
Сначала стоит убедиться, что дело именно в карте сайта, а не в robots.txt, noindex или дублирующихся архивах. Если URL всё ещё индексируется, но уже убран из sitemap, это не ошибка: поисковик мог знать его раньше, либо нашёл ссылку внутри сайта. Поэтому отключение из sitemap — это только один из шагов, а не универсальная кнопка «убрать из поиска».
Что проверить в первую очередь
- тип записей реально присутствует в XML sitemap;
- у него есть публичные URL и они открываются без 404;
- страницы не закрыты отдельно через
noindexили robots; - внутренние ссылки на этот тип записей не создают лишний обход;
- SEO-плагин не генерирует карту сайта поверх настроек WordPress.
Если у вас уже есть плагин для SEO, сначала ищите настройку включения/исключения типа записей в sitemap. Это безопаснее, чем сразу лезть в код: плагин сам знает, как именно он строит карту сайта.
Диагностика: где именно формируется sitemap
В WordPress карта сайта может собираться ядром или SEO-плагином. Важно понять источник, иначе можно править не тот слой. Откройте /wp-sitemap.xml и посмотрите, кто отдаёт файл. Если используется Yoast, Rank Math, All in One SEO или другой SEO-плагин, обычно именно он управляет составом sitemap. Если плагина нет, работает встроенная карта сайта WordPress.
Практический тест простой: временно отключите SEO-плагин на staging-копии и проверьте, меняется ли карта сайта. Если меняется — править нужно настройки плагина или его фильтры. Если нет — смотрим в сторону ядра WordPress и регистрации типа записей.
Способ 1. Убрать тип записей из sitemap через настройки
Если тип записей создаётся плагином или темой и у него есть собственные SEO-настройки, это самый чистый вариант. Обычно нужно найти раздел, где задаётся участие post type в XML sitemap, и отключить его там. Важно не путать это с отключением архива или страницы типа записей: архив и sitemap — разные сущности.
Плюс этого подхода в том, что он обратим и не требует кастомного кода. Минус — не все плагины дают тонкую настройку для каждого типа записей.
Когда интерфейса достаточно
- тип записей создан плагином и имеет собственные SEO-параметры;
- нужно быстро убрать его из sitemap без разработки;
- на сайте нет сложной логики, завязанной на фильтры и хуки;
- вы хотите оставить поддержку обновлений без кастомных правок.
Способ 2. Исключить post type кодом
Если настройки нет, можно исключить тип записей на уровне кода. Для встроенного sitemap WordPress есть фильтр wp_sitemaps_post_types. Он позволяет убрать конкретный post type из списка, который попадает в sitemap.
Пример для functions.php дочерней темы или небольшого mu-plugin:
<?php
add_filter( 'wp_sitemaps_post_types', function( $post_types ) {
unset( $post_types['service'] );
return $post_types;
} );Здесь service — пример slug типа записей. Подставьте свой. После этого WordPress перестанет включать этот тип в sitemap, но сами записи останутся доступными по прямым ссылкам, если они публичные.
Если sitemap генерирует SEO-плагин
У SEO-плагинов свои фильтры. Например, у Yoast и Rank Math логика исключения отличается, и универсального фильтра на все случаи нет. Поэтому сначала смотрите документацию конкретного плагина, а не пытайтесь применить фильтр ядра к чужой генерации sitemap. Это частая ошибка: код написан правильно, но не влияет на нужный источник.
Если нужен именно встроенный sitemap WordPress, а SEO-плагин его не перекрывает, фильтр выше работает стабильно. Если же плагин подменяет карту сайта полностью, исключение надо делать средствами этого плагина.
Способ 3. Не публиковать тип записей в sitemap ещё на этапе регистрации
Если вы сами регистрируете post type, можно сразу задать параметры так, чтобы он не попадал в карту сайта. Для этого при register_post_type() используйте 'show_in_rest' по необходимости, а для sitemap — параметр 'show_in_sitemap' => false, если он поддерживается в вашей версии WordPress и сценарии регистрации.
Пример регистрации служебного типа записей:
<?php
register_post_type( 'service', array(
'label' => 'Service pages',
'public' => true,
'show_ui' => true,
'show_in_rest' => true,
'has_archive' => false,
'rewrite' => array( 'slug' => 'service' ),
'supports' => array( 'title', 'editor' ),
'show_in_sitemap' => false,
) );Этот вариант удобен, если вы контролируете код плагина или темы. Но если post type уже создан сторонним расширением, лучше не переопределять его регистрацию без понимания последствий: можно сломать REST, архивы или админку.
Сравнение подходов
| Способ | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
| Настройки SEO-плагина | Есть нужная опция в интерфейсе | Без кода, безопасно для обновлений | Не всегда есть точечное исключение |
Фильтр wp_sitemaps_post_types | Используется встроенный sitemap WordPress | Точно убирает post type из карты сайта | Не влияет на sitemap сторонних плагинов |
| Параметр регистрации post type | Вы контролируете код типа записей | Решение на уровне архитектуры | Нельзя бездумно менять чужой post type |
Пошаговое решение без лишнего риска
- Определите источник sitemap: ядро WordPress или SEO-плагин.
- Найдите slug типа записей, который нужно исключить.
- Сначала попробуйте штатную настройку плагина, если она есть.
- Если используется встроенный sitemap, добавьте фильтр
wp_sitemaps_post_types. - Очистите кеш сайта и кеш CDN, если он есть.
- Проверьте, что URL исчез из sitemap, но нужные публичные страницы не получили 404.
Как проверить, что всё сработало
Проверка должна быть не только визуальной. Откройте XML sitemap в браузере и найдите нужный тип записей или конкретный URL. Если карта сайта разбита на несколько файлов, проверьте и индекс sitemap, и дочерние файлы.
Дальше сделайте техническую проверку:
curl -s https://example.com/wp-sitemap.xml | grep -i serviceЕсли в ответе ничего нет, это хороший признак, но не финальная гарантия: иногда нужный URL может быть в дочернем sitemap. Поэтому проверяйте ещё и конкретные sitemap-файлы, если они есть. После этого откройте Search Console и посмотрите, не остались ли старые URL в отчётах об индексировании. Они могут висеть там некоторое время, даже если sitemap уже исправлен.
Что считать нормальным результатом
- тип записей исчез из sitemap;
- новые URL этого типа больше не добавляются в карту сайта;
- публичные страницы сайта продолжают открываться;
- в Search Console не появляется новая волна ошибок после изменения;
- кеши очищены, и вы видите актуальную версию XML.
Частые ошибки и как их исправить
Удалили URL из sitemap, но он всё ещё в индексе
Это не баг. Поисковик мог найти страницу по внутренним ссылкам, внешним ссылкам или старым данным. Если URL действительно не должен индексироваться, добавьте noindex и проверьте, не ведут ли на него ссылки из меню, хлебных крошек, похожих записей или XML-карт сайта других типов.
Сломали sitemap целиком
Обычно это происходит, когда фильтр возвращает не массив, а null или перезаписывает список типов записей неправильно. В фильтрах WordPress важно сохранять исходную структуру данных и удалять только нужный элемент через unset().
Правили не тот sitemap
Если на сайте стоит SEO-плагин, встроенный фильтр WordPress может вообще не участвовать в генерации карты сайта. В таком случае код в functions.php выглядит корректно, но не даёт эффекта. Решение — найти именно тот механизм, который реально отдаёт XML.
Не очистили кеш
После изменения sitemap обязательно очищайте кеш плагина, сервера и CDN. Иначе вы будете смотреть на старую версию XML и делать ложные выводы о том, что код не работает.
Безопасность и производительность
Если правите код, лучше не вносить изменения прямо в родительскую тему. Для точечных фильтров удобнее небольшой mu-plugin: он не зависит от темы и не исчезнет после обновления. Это особенно полезно, если исключение из sitemap — часть постоянной технической политики сайта.
Если на сайте много служебных типов записей, не пытайтесь закрывать их все разом без анализа. Иногда правильнее отключить только один post type, а остальные оставить в sitemap, чтобы не ухудшать обход полезного контента. Для сайтов с большим количеством технических дублей и служебных страниц имеет смысл отдельно проверить настройки чистки SEO-следов и дублей, например в Clearfy Pro: Clearfy Pro.
Если вы работаете с кастомным типом записей в плагине или теме, держите рядом минимальный чек-лист перед выкладкой:
- проверить источник sitemap;
- убедиться, что исключается только нужный post type;
- очистить все уровни кеша;
- проверить sitemap в браузере и через
curl; - посмотреть Search Console на предмет старых URL и ошибок обхода.
Такой подход занимает меньше времени, чем последующая ручная чистка последствий после неудачного изменения карты сайта.