Если в XML sitemap попадают служебные страницы, дубли архивов, тестовые записи или приватные разделы, поисковики тратят краулинговый бюджет на мусор. На небольшом сайте это часто незаметно, но на проекте с большим количеством контента sitemap быстро превращается в список того, что индексировать не нужно.
Задача здесь не в том, чтобы «спрятать» URL любой ценой. Правильный сценарий — убрать из карты сайта только те страницы, которые не должны участвовать в обходе, при этом не сломать внутренние ссылки, canonical и доступность для пользователей, если страница всё ещё нужна на сайте.
Когда исключение из sitemap действительно нужно
Сначала стоит понять, что именно вы хотите исправить. Исключение URL из sitemap полезно в таких случаях:
- служебные страницы вроде
/thank-you/,/checkout/,/cart/; - дубли контента из архивов, фильтров или пагинации;
- тестовые записи и страницы для внутренней проверки;
- лендинги, которые должны открываться по прямой ссылке, но не участвовать в поиске;
- страницы с тонким контентом, которые вы пока не хотите отдавать в индекс.
Если URL уже проиндексирован, одного удаления из sitemap может быть недостаточно. Поисковик может ещё какое-то время держать страницу в индексе, особенно если на неё есть внутренние или внешние ссылки. В таком случае обычно комбинируют несколько мер: убрать из sitemap, поставить noindex там, где это уместно, и проверить внутреннюю перелинковку.
Диагностика: что именно попало в sitemap и почему
Прежде чем править код или настройки плагина, откройте сам sitemap и посмотрите, какие типы URL там есть. В WordPress карта сайта может формироваться ядром, SEO-плагином или кастомным кодом темы/плагина. Источник важен: если вы отключите вывод в одном месте, а URL добавляет другое, проблема останется.
Что проверить вручную
- Откройте
/wp-sitemap.xmlили sitemap, который отдаёт SEO-плагин. - Посмотрите, какие разделы там есть: записи, страницы, рубрики, авторы, медиа.
- Найдите конкретный URL, который нужно убрать.
- Проверьте, не создаётся ли он как архив, а не как отдельная страница.
- Убедитесь, что страница не нужна для навигации, формы или авторизации.
Если сайт использует Yoast SEO, Rank Math или другой SEO-плагин, у него обычно есть собственные настройки индексации и sitemap. Для небольшого количества URL проще использовать штатные настройки плагина. Для точечного исключения одного-двух адресов удобнее код.
| Подход | Когда подходит | Минус |
|---|---|---|
| Настройки SEO-плагина | Нужно убрать целый тип контента или архив | Не всегда удобно для точечных URL |
| Код в теме или mu-plugin | Нужно исключить конкретные страницы | Требует аккуратного тестирования |
| Редактирование robots.txt | Нужно ограничить обход, а не сам sitemap | Не удаляет URL из карты сайта |
Пошаговое решение через код
Если sitemap генерирует ядро WordPress, можно исключить запись или страницу из списка с помощью фильтра wp_sitemaps_posts_query_args. Это безопаснее, чем пытаться править XML после генерации: вы убираете объект ещё на этапе выборки.
Ниже пример, который исключает конкретные страницы по ID из sitemap записей и страниц. Код лучше положить в небольшой mu-plugin, а не в functions.php, если вы не хотите потерять настройку при смене темы.
<?php
/**
* Plugin Name: Sitemap exclusions
*/
add_filter( 'wp_sitemaps_posts_query_args', function( $args, $post_type ) {
$excluded_ids = array( 12, 34, 56 );
if ( in_array( $post_type, array( 'page', 'post' ), true ) ) {
$args['post__not_in'] = isset( $args['post__not_in'] )
? array_merge( (array) $args['post__not_in'], $excluded_ids )
: $excluded_ids;
}
return $args;
}, 10, 2 );Если нужно убрать не отдельные страницы, а целый тип контента, например служебные записи кастомного пост-типа, логика та же. Только в условии проверяйте нужный post_type.
Исключение по slug
Когда ID неудобны, можно отфильтровать по slug. Это полезно на проектах, где контент переносится между средами и ID меняются. Пример ниже исключает страницы с конкретными слагами:
<?php
add_filter( 'wp_sitemaps_posts_query_args', function( $args, $post_type ) {
if ( 'page' !== $post_type ) {
return $args;
}
$excluded_slugs = array( 'thank-you', 'privacy-policy', 'internal-test' );
$query = new WP_Query( array(
'post_type' => 'page',
'posts_per_page' => -1,
'fields' => 'ids',
'post_name__in' => $excluded_slugs,
) );
if ( ! empty( $query->posts ) ) {
$args['post__not_in'] = isset( $args['post__not_in'] )
? array_merge( (array) $args['post__not_in'], $query->posts )
: $query->posts;
}
return $args;
}, 10, 2 );Такой вариант чуть тяжелее, чем исключение по ID, потому что делает дополнительный запрос. Для нескольких страниц это нормально, но если список большой, лучше хранить ID в настройках или использовать SEO-плагин.
Если sitemap создаёт SEO-плагин
У Yoast SEO, Rank Math и похожих решений карта сайта обычно управляется через интерфейс. Это удобнее, если нужно отключить архивы авторов, рубрики, медиа или целый тип записей. В таких случаях не стоит дублировать логику кодом: можно получить конфликт между настройками плагина и кастомным фильтром.
Практический порядок такой:
- Проверьте, есть ли у плагина настройка индексации для нужного типа контента.
- Если нужно убрать только одну страницу, посмотрите, можно ли пометить её как
noindexи исключить из sitemap автоматически. - Если плагин не даёт точечного контроля, используйте его фильтры или собственный код.
Для проектов, где нужно регулярно чистить сайт от дублей, служебных страниц и мусора в индексе, удобно держать под рукой инструменты вроде Clearfy Pro: он помогает централизованно управлять SEO-настройками, дублями и технической чисткой. Но даже с плагином всё равно полезно понимать, что именно попадает в sitemap и почему.
Проверка результата после внедрения
После изменений не ограничивайтесь открытием XML в браузере. Нужна проверка на нескольких уровнях:
- страница больше не присутствует в sitemap;
- карта сайта открывается без ошибок;
- исключённый URL не возвращается в других sitemap-файлах, если они разбиты по типам;
- внутренние ссылки на страницу не создают лишний шум в отчётах;
- в Search Console нет новых ошибок обхода, связанных с этим URL.
Если вы используете кэширование, очистите кэш после правки. Иначе можно смотреть на старую версию sitemap и думать, что код не сработал.
Хорошая быстрая проверка — открыть sitemap в приватном окне и найти нужный URL поиском по странице. Если URL исчез, но страница всё ещё доступна по прямой ссылке, значит вы убрали её только из карты сайта, а не из сайта целиком. Это нормальный результат, если именно этого вы и добивались.
Частые ошибки и как их исправить
Удалили URL из sitemap, но он всё равно индексируется
Это ожидаемо, если на страницу ведут внутренние ссылки или она уже известна поисковику. Добавьте noindex, если страница не должна быть в выдаче, и проверьте, нет ли на неё ссылок из меню, хлебных крошек, футера или старых статей.
Сломали sitemap после фильтра
Частая причина — неправильный тип данных в массиве или слишком агрессивная логика в фильтре. Если после правки XML не открывается, временно отключите код и проверьте логи PHP. В фильтрах WordPress лучше возвращать исходный массив, если условие не выполнено.
Исключили не ту страницу
Такое бывает, если ориентироваться только на slug, а на сайте есть одинаковые слаги в разных типах контента или языковых версиях. В этом случае надёжнее использовать ID или проверять и тип записи, и slug одновременно.
Ожидали, что robots.txt удалит URL из sitemap
Не удалит. robots.txt управляет обходом, а sitemap — списком URL для обхода. Это разные механизмы. Если нужно убрать адрес из карты сайта, правьте генерацию sitemap, а не только robots.
Чек-лист перед публикацией изменений
- Поняли, кто генерирует sitemap: ядро WordPress или SEO-плагин.
- Проверили, нужен ли URL пользователям, а не только поисковикам.
- Выбрали способ исключения: настройка плагина или код.
- Очистили кэш сайта и CDN, если он есть.
- Проверили sitemap в браузере и в Search Console.
- Убедились, что исключённый URL не дублируется в другом sitemap-файле.
- При необходимости добавили
noindexи убрали внутренние ссылки.
Практические советы по безопасности и производительности
Если вы делаете исключения через код, не встраивайте логику в случайный шаблон. Лучше оформить это как маленький mu-plugin или отдельный плагин проекта. Так вы не потеряете изменения при обновлении темы и не забудете, где именно лежит техническая правка.
Не делайте лишние запросы в фильтрах sitemap, если список исключений большой и меняется редко. Для стабильных проектов проще хранить ID в опции или использовать настройки SEO-плагина. Чем меньше логики на генерации sitemap, тем меньше риск замедлить выдачу XML на больших сайтах.
Если нужна не только точечная чистка sitemap, но и системная работа с дублями, служебными страницами и техническим SEO, имеет смысл выстроить это как отдельный регламент: что закрываем от индекса, что оставляем доступным, что убираем из карты сайта, а что просто помечаем noindex. Тогда sitemap перестаёт быть списком случайных URL и начинает работать как управляемый сигнал для поисковиков.