Ситуация типичная: сайт уже работает на встроенной карте сайта WordPress, но в ней оказываются страницы, которые не должны попадать в поиск — черновые посадочные, служебные шаблоны, приватные материалы, тестовые записи, страницы благодарности после форм. Сам sitemap при этом формально валидный, но поисковику вы сами подсовываете лишние URL.
Если задача не в том, чтобы отключить sitemap целиком, а в том, чтобы точечно убрать отдельные страницы, лучше решать это на уровне генерации карты сайта или через noindex/exclude для конкретных сущностей. Ниже — рабочие варианты без выдуманных хуков и без лишней магии.
Когда проблема действительно в sitemap
Сначала стоит убедиться, что URL попадает именно в XML sitemap, а не просто индексируется по внутренним ссылкам. Откройте карту сайта WordPress, обычно это /wp-sitemap.xml, и найдите нужный URL в соответствующем разделе: записи, страницы, авторы, таксономии.
Признаки, что проблема именно в карте сайта:
- URL есть в
wp-sitemap.xml, хотя страница не должна индексироваться; - страница не закрыта от индексации, но вы не хотите вообще светить её поисковику;
- URL не должен участвовать в SEO-структуре сайта, потому что это служебный маршрут или приватный контент.
Если URL уже в индексе, одного удаления из sitemap недостаточно. Тогда нужно дополнительно закрыть страницу от индексации и убрать внутренние ссылки на неё. Но сначала — исключаем её из карты сайта.
Какой способ выбрать: код, плагин или настройка
Для точечного исключения есть три нормальных пути. Выбор зависит от того, где и как у вас формируется sitemap.
| Способ | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
Код через фильтр wp_sitemaps_posts_query_args | Нужно убрать записи/страницы по ID, статусу или метке | Точно, прозрачно, без лишних плагинов | Нужно править код темы или мини-плагина |
| Плагин для SEO | Уже используете SEO-плагин и хотите управлять индексированием из админки | Удобно редакторам, меньше ручной работы | Логика зависит от конкретного плагина |
noindex без удаления из sitemap | Нужно быстро закрыть страницу, но не трогать генерацию карты | Просто внедрить | URL всё ещё может попадать в sitemap |
Если нужен именно контроль над XML sitemap, самый предсказуемый вариант — фильтр WordPress. Он не ломает ядро и работает на стандартной карте сайта.
Диагностика: что именно исключать
Перед правкой кода составьте короткий список URL, которые не должны попадать в sitemap. Обычно это:
- страницы благодарности после отправки формы;
- служебные страницы входа и регистрации, если они созданы как обычные страницы;
- тестовые записи и черновики, случайно опубликованные;
- дубли посадочных страниц под A/B-тесты;
- приватные страницы для клиентов или сотрудников;
- архивы, которые не несут ценности, если они созданы вручную как страницы.
Важно: не пытайтесь исключать всё подряд по шаблону, если у вас есть нормальная структура сайта. Например, массовое исключение по слову в заголовке легко зацепит полезные страницы.
Пошаговое решение через код
Ниже пример для исключения конкретных страниц из sitemap по ID. Это самый безопасный вариант, если список небольшой и понятный.
add_filter( 'wp_sitemaps_posts_query_args', function( $args, $post_type ) {
if ( 'page' !== $post_type ) {
return $args;
}
$excluded_ids = array( 12, 34, 56 );
if ( empty( $args['post__not_in'] ) ) {
$args['post__not_in'] = array();
}
$args['post__not_in'] = array_unique( array_merge( $args['post__not_in'], $excluded_ids ) );
return $args;
}, 10, 2 );Что делает этот код:
- срабатывает только для типа записей
page; - добавляет нужные ID в
post__not_in; - не затрагивает записи, если вы не указали их отдельно.
Если нужно исключить не только страницы, но и записи, можно расширить условие:
add_filter( 'wp_sitemaps_posts_query_args', function( $args, $post_type ) {
$excluded_map = array(
'page' => array( 12, 34, 56 ),
'post' => array( 78, 90 ),
);
if ( empty( $excluded_map[ $post_type ] ) ) {
return $args;
}
$args['post__not_in'] = isset( $args['post__not_in'] ) ? (array) $args['post__not_in'] : array();
$args['post__not_in'] = array_unique( array_merge( $args['post__not_in'], $excluded_map[ $post_type ] ) );
return $args;
}, 10, 2 );Если у вас есть мини-плагин или mu-plugin, лучше положить код туда, а не в functions.php активной темы. Так исключения не исчезнут после смены темы.
Как исключать по шаблону или статусу
Иногда удобнее исключать не по ID, а по признаку. Например, если у служебных страниц есть отдельный шаблон. Тогда можно отфильтровать список уже на уровне запроса, но здесь важно не переусердствовать: WordPress sitemap не предназначен для сложной бизнес-логики.
Практичнее использовать отдельную метку в метаполе и исключать страницы, у которых она включена. Но для этого уже нужен более аккуратный подход и тестирование, чтобы не сломать выборку.
Если используете SEO-плагин
В SEO-плагинах обычно есть настройка индексации для конкретной записи или типа записей. Это удобно, если редактор должен сам управлять видимостью страниц без доступа к коду. Но важно понимать: noindex и исключение из sitemap — не одно и то же.
Если страница должна быть полностью скрыта от поиска, проверьте два пункта:
- страница не попадает в XML sitemap;
- у страницы стоит
noindexили она закрыта другим корректным способом.
Иначе поисковик может продолжать находить URL по внутренним ссылкам или внешним упоминаниям.
Проверка результата после внедрения
После правки кода или настроек не ограничивайтесь визуальной проверкой в админке. Проверьте фактический результат:
- Откройте
/wp-sitemap.xmlи нужный раздел карты сайта. - Убедитесь, что исключённого URL там больше нет.
- Проверьте исходный код страницы: нет ли там лишних canonical-ошибок или мета-тегов, которые противоречат задаче.
- Если URL уже был в индексе, отправьте его на переобход в Google Search Console и проверьте статус через некоторое время.
Для быстрой проверки можно использовать поиск по sitemap в браузере или команду curl:
curl -s https://example.com/wp-sitemap.xml | grep -i "thank-you"Если строка не находится, а URL действительно должен быть исключён, значит карта сайта обновилась корректно.
Частые ошибки и как их исправить
- Удалили URL из sitemap, но страница всё ещё индексируется. Значит, она доступна по внутренним ссылкам или уже была проиндексирована раньше. Добавьте
noindexи уберите ссылки на неё. - Правка внесена в functions.php, а после обновления темы всё пропало. Перенесите код в мини-плагин или mu-plugin.
- Исключили не тот тип записей. В фильтре важно проверять
$post_type, иначе можно случайно затронуть нужный контент. - Список ID устарел. После переноса сайта или импорта контента ID могут измениться. Лучше вести короткий реестр служебных страниц.
- Пытались закрыть всё через robots.txt. Это не заменяет корректную настройку sitemap и
noindex. Robots.txt не удаляет URL из индекса сам по себе.
Что делать, если страниц много и они регулярно меняются
Если служебных страниц становится много, ручной список ID быстро превращается в проблему поддержки. В таком случае лучше выстроить правило: все такие страницы создаются с отдельным шаблоном, меткой или статусом в метаполе, а затем исключаются по этому признаку в одном месте.
Для редакторов удобнее, когда процесс не требует кода каждый раз. Но даже тогда стоит оставить технический контроль на стороне разработчика: проверка sitemap, проверка индексации и ревизия служебных URL должны быть регулярной задачей.
Если вам нужно не только убрать страницы из карты сайта, но и почистить сайт от лишних технических сущностей, имеет смысл посмотреть в сторону инструментов, которые помогают управлять дублями, служебными страницами и SEO-настройками централизованно. Например, у Clearfy Pro есть набор функций для технической чистки сайта и контроля SEO-обвязки: https://wpshop.ru/plugins/clearfy.
Мини-чек-лист перед публикацией
- определили, какие URL должны исчезнуть из sitemap;
- проверили, что исключение не затронет полезные страницы;
- внесли правку в код или SEO-настройки;
- открыли
/wp-sitemap.xmlи подтвердили результат; - при необходимости добавили
noindexи убрали внутренние ссылки; - проверили Search Console после переобхода.
Если задача решена аккуратно, sitemap остаётся полезным для поисковиков, а служебные и приватные страницы перестают светиться там, где им не место.