Если в XML sitemap попадают служебные страницы, тестовые CPT, пустые таксономии или архивы, поисковик тратит краулинговый бюджет на мусор. На небольшом сайте это обычно не критично, но на проекте с кастомными типами записей и плагинами для контента карта сайта быстро превращается в список того, что индексировать не нужно.
Задача здесь не в том, чтобы «выключить sitemap», а в том, чтобы оставить в нем только те URL, которые реально должны попадать в поиск. Для WordPress это можно сделать через настройки SEO-плагина или кодом, если нужен точечный контроль.
Когда sitemap уже мешает, а не помогает
Проблема обычно проявляется не сразу. Сначала в Search Console появляются URL из служебных разделов, потом растет число «Просканировано, но не проиндексировано», а в отчете по страницам можно увидеть записи, которые вообще не должны были оказаться в карте сайта.
Проверьте типичные признаки:
- в sitemap есть
/wp-json/или другие технические URL — это уже ошибка настройки; - попадают записи из CPT, которые не предназначены для поиска;
- в карту сайта включены архивы авторов, дат или пустые рубрики;
- в sitemap есть страницы с
noindex, но они продолжают отдаваться в XML; - после удаления контента URL еще долго висит в карте сайта и в отчетах краулера.
Если у вас стоит SEO-плагин, сначала проверьте его настройки. Если sitemap генерируется ядром WordPress, тогда нужен фильтр на уровне кода.
Диагностика: что именно попадает в карту сайта
Начните с простого сравнения: откройте sitemap в браузере и посмотрите, какие разделы он содержит. В WordPress 5.5+ базовая XML-карта сайта генерируется ядром, а многие SEO-плагины подменяют или расширяют ее. Поэтому источник проблемы зависит от того, кто именно формирует XML.
Проверка через браузер и Search Console
Откройте /wp-sitemap.xml или sitemap, который отдает ваш SEO-плагин. Если там есть лишние типы записей, проверьте, не включены ли они в публичный вывод и не отмечены ли как доступные для архивов.
В Search Console полезно смотреть не только сам sitemap, но и список проиндексированных URL. Если в нем есть страницы, которые вы не планировали индексировать, карта сайта часто лишь подсвечивает уже существующую проблему.
Что проверить в настройках CPT и таксономий
Для кастомных типов записей важны параметры public, publicly_queryable, has_archive и exclude_from_search. Они не управляют sitemap напрямую, но влияют на то, как WordPress и плагины воспринимают объект.
register_post_type('docs', array(
'label' => 'Документация',
'public' => true,
'publicly_queryable' => true,
'has_archive' => false,
'exclude_from_search' => true,
));Если такой тип записей не должен индексироваться, одного exclude_from_search недостаточно. Его нужно либо исключить из sitemap, либо дополнительно закрыть от индексации через noindex и robots-настройки.
Как убрать лишние типы записей из XML sitemap
Есть два рабочих подхода: через интерфейс SEO-плагина или через фильтры WordPress. Если задача типовая, удобнее плагин. Если нужен точный контроль по проекту, лучше код.
| Подход | Когда подходит | Минус |
|---|---|---|
| Настройки SEO-плагина | Нужно быстро скрыть CPT, таксономии, архивы | Меньше гибкости, зависит от плагина |
| Код через фильтры | Нужны точечные правила для конкретного сайта | Требует поддержки в теме или mu-plugin |
| Комбинированный вариант | Часть правил в плагине, часть в коде | Легко запутаться без документации |
Вариант через ядро WordPress
Если вы используете стандартный sitemap WordPress, можно отключить отдельные типы записей через фильтр wp_sitemaps_post_types. Это безопаснее, чем пытаться править XML руками.
add_filter('wp_sitemaps_post_types', function ($post_types) {
unset($post_types['docs']);
unset($post_types['landing']);
return $post_types;
});Такой код лучше размещать в небольшом mu-plugin или в отдельном функциональном плагине, а не в functions.php активной темы. Тогда правило не исчезнет при смене темы.
Как убрать отдельные таксономии
Для таксономий есть фильтр wp_sitemaps_taxonomies. Он полезен, когда в sitemap попадают служебные рубрики, теги-«пустышки» или технические классификаторы.
add_filter('wp_sitemaps_taxonomies', function ($taxonomies) {
unset($taxonomies['post_tag']);
unset($taxonomies['internal_group']);
return $taxonomies;
});Но здесь важно не переусердствовать. Если теги или рубрики реально дают трафик, их лучше не вырезать из sitemap без анализа. Сначала посмотрите, есть ли у них поисковый спрос и индексируются ли они вообще.
Если sitemap генерирует SEO-плагин
У популярных SEO-плагинов логика своя. Обычно там можно отключить отдельные типы контента, архивы и таксономии через интерфейс. Это предпочтительный путь, если сайт ведется без кастомного кода и команда не хочет поддерживать фильтры.
Но есть нюанс: иногда плагин скрывает URL из sitemap, а сам раздел остается доступным для индексации. В этом случае нужно проверить связку из трех вещей: sitemap, noindex и внутренние ссылки.
- если страница не должна индексироваться, она не должна быть в sitemap;
- если она доступна по прямой ссылке, проверьте meta robots;
- если на нее ведут внутренние ссылки, поисковик все равно может ее найти.
Для проектов с большим количеством служебных страниц иногда удобнее использовать Clearfy Pro, если нужен не только контроль sitemap, но и чистка дублей, лишних архивов и технических страниц в одном месте. Но и в этом случае сначала проверьте, какие именно URL плагин скрывает, а какие только помечает как noindex.
Пошаговое решение без лишнего риска
Ниже рабочая последовательность, которая обычно не ломает индексацию нужных страниц.
- Составьте список типов записей, таксономий и архивов, которые не должны попадать в поиск.
- Проверьте, кто генерирует sitemap: ядро WordPress или SEO-плагин.
- Сначала отключите лишнее через настройки плагина, если это возможно.
- Если настроек недостаточно, добавьте фильтры в mu-plugin.
- После изменений обновите sitemap и отправьте его на переобход в Search Console.
- Проверьте, не осталось ли внутренних ссылок на скрытые URL.
Пример mu-plugin для точечного исключения
Если нужен отдельный мини-плагин, создайте файл в wp-content/mu-plugins/disable-sitemap-parts.php и добавьте туда код:
<?php
/**
* Plugin Name: Disable Sitemap Parts
*/
add_filter('wp_sitemaps_post_types', function ($post_types) {
unset($post_types['docs']);
return $post_types;
});
add_filter('wp_sitemaps_taxonomies', function ($taxonomies) {
unset($taxonomies['internal_group']);
return $taxonomies;
});Этот вариант удобен тем, что не зависит от темы и не требует ручного включения в админке. Для продакшена это обычно надежнее, чем править шаблоны.
Как проверить, что решение сработало
Проверка нужна не только в браузере. Сначала убедитесь, что sitemap реально изменился, потом проверьте реакцию поисковика.
- откройте XML и убедитесь, что исключенные типы больше не перечисляются;
- проверьте ответ сервера на скрытые URL — они могут оставаться доступными, даже если исчезли из sitemap;
- в Search Console отправьте sitemap повторно и посмотрите, не растет ли число ошибок;
- если URL уже были в индексе, проверьте их статус через инспектор URL;
- посмотрите логи краулера или серверные логи, если нужно понять, откуда поисковик берет адреса.
Хороший признак — в отчете по sitemap исчезают ненужные разделы, а в индексе не появляется новый мусор. Но старые URL могут держаться какое-то время, если на них есть внешние ссылки или они уже были проиндексированы раньше.
Частые ошибки и как их исправить
Удалили из sitemap, но не закрыли от индексации
Это самая частая ситуация. URL исчез из карты сайта, но остался доступен по прямой ссылке и продолжает индексироваться. Решение: добавить noindex, убрать внутренние ссылки и при необходимости настроить canonical на релевантную страницу.
Скрыли нужный раздел вместе с мусором
Иногда в фильтр попадает слишком широкий массив, и из sitemap исчезает весь CPT, хотя часть записей должна индексироваться. Проверяйте ключи массива по одному и не удаляйте типы «на глаз».
Правили functions.php и потеряли настройку после обновления темы
Для таких задач лучше использовать mu-plugin или собственный мини-плагин. Это особенно важно, если сайт обслуживается не одним разработчиком.
Не обновили кэш после изменений
Если стоит кэш страницы, CDN или плагин кэширования, старый XML может отдаваться еще какое-то время. После правок очистите кэш сайта и, если нужно, кэш на стороне CDN.
Безопасность и производительность: что имеет смысл учесть
С точки зрения производительности sitemap сам по себе не должен быть тяжелым, но на больших сайтах с десятками тысяч записей и сложными фильтрами генерация может давать лишнюю нагрузку. Поэтому не стоит строить логику исключений через дорогие запросы к базе на каждом хите.
Практичнее держать правила простыми: исключать по ключам массива, по заранее известным типам записей и таксономиям, без дополнительных запросов. Если логика сложная, лучше вычислять список исключений заранее и хранить его в опции или конфиге.
Еще один момент — не открывайте доступ к служебным XML-файлам на запись и не пытайтесь править sitemap через шаблоны темы. Это не только неудобно, но и опасно при обновлениях.
Если вам нужно одновременно чистить sitemap, убирать дубли и наводить порядок в технических разделах, удобнее собрать это в одном месте, а не размазывать по теме и нескольким плагинам. Для таких задач как раз и используют инструменты уровня Clearfy Pro, но только там, где это действительно экономит поддержку.
В итоге рабочая схема простая: определить источник sitemap, убрать лишнее через штатные фильтры или настройки, проверить индексацию в Search Console и не оставлять служебные URL доступными без необходимости. Это тот случай, где аккуратная настройка дает больше пользы, чем попытка «починить SEO» одной галочкой.