Ситуация типовая: в WordPress есть служебные или посадочные страницы на отдельном шаблоне, и они не должны попадать в XML sitemap. Например, это страницы благодарности, внутренние лендинги для рекламы, технические страницы с нестабильным содержимым или шаблон, который используется только для служебных задач. Если такие URL остаются в карте сайта, поисковик тратит обход на лишние страницы, а в отчётах начинают всплывать ненужные адреса.
Решение зависит от того, как у вас формируется sitemap. Если используется встроенная XML-карта WordPress, можно отфильтровать список страниц программно. Если sitemap генерирует SEO-плагин, логика будет другой, но общий принцип тот же: исключать не по названию страницы, а по признаку, который можно проверить на сервере.
Когда это действительно нужно
Не стоит вырезать из sitemap всё подряд только потому, что страница «неважная». Исключать имеет смысл только то, что не должно индексироваться или не приносит ценности в поиске. Для шаблонов это особенно удобно: у страницы может быть обычный контент, но сам шаблон делает её технической, временной или закрытой для индексации.
Типичные сценарии
- страницы благодарности после формы заявки;
- служебные лендинги для рекламы, которые не должны жить в поиске;
- страницы с персонализированным контентом;
- внутренние тестовые страницы на отдельном шаблоне;
- страницы, которые уже закрыты от индексации, но всё ещё попадают в sitemap.
Диагностика: как понять, откуда берётся URL в sitemap
Сначала проверьте, кто именно генерирует карту сайта. Это важно, потому что фильтры WordPress работают только для встроенного sitemap, а SEO-плагины часто используют свои механизмы.
- Откройте
/wp-sitemap.xml. Если карта выглядит стандартно, скорее всего, работает ядро WordPress. - Если sitemap отдаёт Yoast, Rank Math или другой SEO-плагин, ищите настройки исключения в самом плагине.
- Проверьте, есть ли у страницы отдельный шаблон через редактор страницы или через метабокс шаблона в админке.
- Сравните URL страницы с тем, что реально попадает в sitemap: иногда проблема не в шаблоне, а в типе записи или таксономии.
Если карта сайта встроенная, можно исключать страницы через фильтр wp_sitemaps_posts_query_args. Он позволяет изменить аргументы запроса, которым WordPress собирает список страниц для sitemap.
Решение через код: исключаем страницы по шаблону
Самый надёжный вариант — проверить шаблон страницы в запросе и убрать такие записи из sitemap. Это удобно, если у вас есть один или несколько шаблонов, которые не должны индексироваться.
Добавьте код в functions.php дочерней темы или в небольшой mu-plugin. Для production лучше использовать mu-plugin, чтобы фильтр не зависел от активной темы.
<?php
add_filter( 'wp_sitemaps_posts_query_args', function( $args, $post_type ) {
if ( 'page' !== $post_type ) {
return $args;
}
$excluded_templates = array(
'templates/thank-you.php',
'templates/landing-technical.php',
);
$page_ids = get_posts( array(
'post_type' => 'page',
'post_status' => 'publish',
'fields' => 'ids',
'nopaging' => true,
'meta_query' => array(
array(
'key' => '_wp_page_template',
'value' => $excluded_templates,
'compare' => 'IN',
),
),
) );
if ( ! empty( $page_ids ) ) {
$args['post__not_in'] = isset( $args['post__not_in'] )
? array_merge( (array) $args['post__not_in'], $page_ids )
: $page_ids;
}
return $args;
}, 10, 2 );Что делает этот код:
- срабатывает только для страниц;
- ищет страницы с нужными шаблонами по метаполю
_wp_page_template; - добавляет их ID в
post__not_in; - в итоге такие страницы не попадают в XML sitemap WordPress.
Если нужно исключить только одну страницу
Иногда шаблон используется и для обычных страниц, и для служебных. Тогда лучше исключать не весь шаблон, а конкретную страницу по ID или slug. Это проще контролировать и меньше риск случайно выкинуть полезный URL из карты сайта.
<?php
add_filter( 'wp_sitemaps_posts_query_args', function( $args, $post_type ) {
if ( 'page' !== $post_type ) {
return $args;
}
$args['post__not_in'] = isset( $args['post__not_in'] )
? array_merge( (array) $args['post__not_in'], array( 123 ) )
: array( 123 );
return $args;
}, 10, 2 );Сравнение подходов
| Подход | Когда подходит | Минус |
|---|---|---|
| Исключение по шаблону | Один шаблон = один тип служебных страниц | Нужно следить, чтобы шаблон не начали использовать для обычных страниц |
| Исключение по ID | Нужно убрать конкретную страницу | При переносе контента ID может измениться |
| Настройка в SEO-плагине | Sitemap генерирует не ядро WordPress | Логика зависит от плагина, универсального фильтра может не быть |
Проверка результата после внедрения
После добавления кода не ограничивайтесь визуальной проверкой в админке. Нужно убедиться, что URL действительно исчез из sitemap и не отдаётся поисковику как доступный для обхода.
- Откройте
/wp-sitemap.xmlи найдите нужную страницу вручную. - Если sitemap разбит на несколько файлов, проверьте вложенные карты, например
/wp-sitemap-posts-page-1.xml. - Посмотрите исходный код страницы в браузере и убедитесь, что ссылка на исключённый URL не осталась в sitemap.
- Проверьте страницу в Google Search Console, если она уже была отправлена ранее.
Если URL всё ещё виден, причина обычно одна из трёх: код не загрузился, sitemap генерирует SEO-плагин, либо шаблон у страницы указан не так, как вы ожидаете.
Частые ошибки и как их исправить
Код добавили не туда
Если вставить фильтр в активную тему, а потом сменить тему, исключение пропадёт. Для технических правил лучше использовать mu-plugin или отдельный мини-плагин. Так логика не сломается после обновления дизайна.
Проверяют не тот sitemap
Встроенный sitemap WordPress и sitemap SEO-плагина — это разные механизмы. Если у вас активен Yoast SEO или Rank Math, код для wp_sitemaps_posts_query_args может вообще не повлиять на итоговый файл.
Исключают по шаблону без контроля
Шаблон может использоваться повторно. Если вы исключили его целиком, проверьте все страницы, которые на нём сидят. Иначе можно случайно убрать из индекса полезные посадочные страницы.
Путают индексацию и sitemap
Удаление URL из sitemap не равно запрету на индексацию. Если страница должна быть закрыта полностью, дополнительно проверьте noindex, canonical и внутренние ссылки. Иначе поисковик может найти её через другие источники.
Что проверить в безопасности и производительности
Сам фильтр лёгкий, но способ поиска страниц по шаблону через get_posts() лучше не усложнять без необходимости. Если у вас много страниц и несколько шаблонов, логичнее ограничить список шаблонов и не делать тяжёлые запросы на каждом обращении к sitemap.
- используйте дочернюю тему или mu-plugin;
- не храните список шаблонов в коде, если он часто меняется — вынесите его в отдельную настройку;
- после изменений очистите кэш, если sitemap кэшируется плагином или сервером;
- не закрывайте от индексации страницы только через удаление из sitemap, если они реально должны быть скрыты.
Если нужен более широкий контроль над дублями, техническими страницами и индексацией, в таких задачах часто помогает Clearfy Pro: он закрывает часть типовых SEO- и технических настроек без ручного редактирования кода. Но для исключения по шаблону всё равно удобнее точечный код, потому что он привязан к вашей структуре сайта.
Когда лучше не трогать sitemap кодом
Если у страницы нет стабильного шаблона, а исключение нужно временно, не встраивайте жёсткую логику в тему. В таких случаях проще:
- поставить
noindexна саму страницу; - убрать её из меню и внутренних ссылок;
- исключить через настройки SEO-плагина, если он это поддерживает;
- после завершения кампании вернуть URL обратно в sitemap.
Так вы не привяжете техническое решение к разовой маркетинговой задаче и не забудете потом снять ограничение.