Ситуация типовая: карта сайта в WordPress работает, но в ней оказываются служебные страницы, внутренние лендинги, дубли или материалы, которые не должны попадать в индекс. Полностью отключать XML sitemap ради пары URL — плохая идея. Гораздо полезнее точечно исключить нужные страницы и при этом не сломать остальную индексацию.
Ниже разберём, как это сделать штатными средствами WordPress и через код, как проверить, что URL действительно исчезли из sitemap, и где чаще всего ошибаются.
Когда проблема действительно в sitemap
Сначала стоит убедиться, что лишний URL попал именно в XML sitemap, а не просто индексируется по внешним ссылкам или уже лежит в поиске из старой версии сайта. Для этого откройте карту сайта и найдите проблемную страницу вручную или через поиск по файлу sitemap.
Признаки, что URL нужно исключать именно из карты сайта
- страница есть в XML sitemap, но не должна участвовать в SEO;
- у страницы нет ценности для поиска: служебный шаблон, тестовый контент, внутренний дубль;
- страница уже закрыта от индексации, но продолжает светиться в sitemap;
- в Search Console появляются сообщения о страницах, которые не должны индексироваться.
Если URL уже открыт для индексации и вы хотите убрать его из поиска, одного удаления из sitemap недостаточно. В таком случае обычно нужно сочетать noindex и исключение из карты сайта.
Какие есть варианты исключения URL из XML sitemap
В WordPress есть несколько рабочих подходов. Выбор зависит от того, чем именно генерируется sitemap: ядром WordPress, SEO-плагином или кастомной логикой темы.
| Способ | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
| Настройки SEO-плагина | Если sitemap генерирует Yoast SEO, Rank Math и т.п. | Без кода, быстро | Не всегда удобно для точечных исключений |
| Фильтр в теме или мини-плагине | Если нужен контроль над конкретными URL | Гибко, прозрачно | Нужно аккуратно поддерживать код |
| noindex + исключение из sitemap | Если страница не должна индексироваться вообще | SEO-логика согласована | Нужно проверить обе стороны |
Шаг 1. Проверьте, кто именно генерирует sitemap
В WordPress 5.5+ есть встроенная XML-карта сайта. Но на практике её часто заменяет SEO-плагин. Это важно: фильтры для ядра и для плагинов разные.
Если у вас установлен SEO-плагин, сначала проверьте его настройки. Например, в Yoast SEO и Rank Math можно отключать типы записей, таксономии и отдельные архивы. Но если задача касается одной-двух страниц, удобнее использовать код.
Шаг 2. Исключите конкретные страницы через фильтр
Для встроенной карты сайта WordPress можно отфильтровать список URL перед выводом. Самый практичный вариант — убрать конкретные записи по ID или по условию. Ниже пример для мини-плагина или functions.php дочерней темы.
<?php
add_filter( 'wp_sitemaps_posts_query_args', function( $args, $post_type ) {
if ( 'page' !== $post_type ) {
return $args;
}
// Исключаем конкретные страницы по ID.
$exclude_ids = array( 12, 34, 56 );
if ( empty( $args['post__not_in'] ) ) {
$args['post__not_in'] = array();
}
$args['post__not_in'] = array_merge( $args['post__not_in'], $exclude_ids );
return $args;
}, 10, 2 );Этот вариант работает для встроенного sitemap WordPress и убирает указанные страницы из выборки. Если у вас другой тип записей, замените page на нужный post_type.
Как исключить страницу по slug
Если ID неудобны, можно сначала получить запись по slug и исключить её программно. Это полезно, когда контент переносится между сайтами и ID меняются.
<?php
add_filter( 'wp_sitemaps_posts_query_args', function( $args, $post_type ) {
if ( 'page' !== $post_type ) {
return $args;
}
$page = get_page_by_path( 'test-page' );
if ( $page instanceof WP_Post ) {
$args['post__not_in'] = array_merge(
$args['post__not_in'] ?? array(),
array( $page->ID )
);
}
return $args;
}, 10, 2 );Это уже чуть медленнее, чем исключение по ID, но для одной страницы разница несущественна. Если список большой, лучше хранить ID в настройках или в константе.
Шаг 3. Если sitemap генерирует SEO-плагин, используйте его фильтры
У SEO-плагинов логика своя. Например, в Yoast SEO можно исключать записи из sitemap через фильтры, а в Rank Math — через свои механизмы. Здесь важно не смешивать фильтры ядра WordPress и фильтры плагина.
Если плагин позволяет исключить запись через интерфейс, это обычно самый безопасный путь. Но если нужен код, ориентируйтесь на документацию конкретного плагина и не вставляйте фильтр «наугад» в functions.php без проверки: в лучшем случае он просто не сработает, в худшем — сломает генерацию карты сайта.
Шаг 4. Согласуйте sitemap и robots/noindex
Удалить URL из sitemap — это только половина задачи. Если страница не должна индексироваться, добавьте для неё noindex. Иначе поисковик может найти её по ссылкам на сайте или извне.
Практически это выглядит так:
- страница не нужна в поиске — ставим
noindex; - страница не нужна в sitemap — исключаем её из генерации;
- страница должна быть доступна пользователю, но не поиску — оставляем доступ, убираем из sitemap и закрываем от индексации.
Если у вас уже есть SEO-плагин, не дублируйте правила в двух местах. Два разных механизма часто создают путаницу: в sitemap URL уже нет, но мета-тег noindex не выставлен, или наоборот.
Диагностика: как понять, что решение сработало
После изменений проверьте не только сам sitemap, но и фактическую отдачу страницы.
- Откройте XML sitemap в браузере и убедитесь, что URL исчез.
- Проверьте исходный код страницы: нет ли там
noindex, если он нужен. - Посмотрите заголовки ответа, если используете серверные правила.
- В Google Search Console отправьте sitemap на повторную обработку и проверьте отчёты по страницам.
Если URL всё ещё в sitemap, проблема обычно в одном из трёх мест: фильтр не туда повесили, плагин перезаписывает карту сайта, или кэш отдаёт старую версию файла.
Быстрая проверка через WP-CLI
Если у вас есть доступ к WP-CLI, можно быстро проверить, что запись существует и имеет нужный статус. Это не проверка sitemap напрямую, но помогает понять, не мешает ли, например, статус draft или кастомная логика публикации.
wp post get 12 --field=post_status
wp post get 12 --field=post_type
wp post get 12 --field=post_nameЧастые ошибки и как их исправить
- Отключили sitemap целиком вместо одной страницы. Обычно это происходит, когда правят настройки плагина без понимания, какой именно тип записей нужен. Решение: возвращайте карту сайта и исключайте только проблемный URL.
- Используют фильтр ядра, а sitemap генерирует SEO-плагин. Тогда код не срабатывает вообще. Решение: проверьте источник sitemap и используйте его фильтры.
- Удалили URL из sitemap, но не поставили
noindex. Страница может остаться в индексе или вернуться туда через ссылки. Решение: согласуйте карту сайта и мета-роботы. - Не очистили кэш. Плагин кэша, серверный кэш или CDN могут отдавать старый sitemap. Решение: сбросьте кэш на всех уровнях.
- Исключили по ID, а на другом сайте ID уже другие. Это частая проблема при переносе. Решение: для миграций лучше использовать явные условия по slug или хранить список в настройках.
Практические советы по безопасности и производительности
Если вы добавляете код вручную, не правьте родительскую тему. Используйте дочернюю тему или небольшой mu-plugin. Так исключения из sitemap не пропадут после обновления темы.
Для нескольких URL лучше не раздувать логику в functions.php. Небольшой кастомный плагин проще сопровождать и легче отключить при диагностике. Это особенно полезно, если на сайте несколько человек правят SEO-настройки и код параллельно.
Если у вас большой сайт, не делайте тяжёлые запросы внутри фильтра sitemap. Например, не стоит каждый раз искать десятки записей через сложные WP_Query. Для стабильной работы лучше заранее хранить список исключений и использовать простую проверку по ID.
Когда лучше не писать код
Если задача сводится к отключению целого типа записей, таксономии или архива, удобнее использовать настройки SEO-плагина. Код нужен тогда, когда исключение точечное и вы хотите предсказуемое поведение без лишних переключателей в админке.
Если на сайте уже используется Clearfy Pro, часть задач по чистке дублей и SEO-настройкам можно закрыть через интерфейс плагина, но для точечного исключения конкретной страницы из sitemap всё равно полезно понимать, как работает фильтрация на уровне WordPress.
После внедрения обязательно проверьте, что:
- URL исчез из XML sitemap;
- страница получила нужный статус индексации;
- кэш очищен;
- в Search Console нет противоречивых сигналов;
- другие карты сайта не дублируют тот же URL.
Если всё это сходится, решение можно считать рабочим: карта сайта остаётся полной для нужных страниц и при этом не тащит в поиск лишние URL.