Как исключить страницы из XML sitemap в WordPress по условиям

Если в XML sitemap попадают служебные страницы, черновые разделы или контент, который не должен ускоренно индексироваться, не обязательно отключать карту сайта целиком. В WordPress можно точечно исключать объекты по ID, типу записи, таксономии или по собственному правилу через фильтр wp_sitemaps_posts_query_args и связанные хуки.

Это полезно, когда sitemap уже работает, но в нём оказываются страницы, которые мешают индексации: тестовые материалы, дубли, внутренние разделы, устаревшие посадочные страницы. Ниже — рабочий сценарий без выдуманных плагинов и без ломки ядра.

Когда проблема действительно в sitemap

Сначала стоит убедиться, что дело именно в карте сайта, а не в robots.txt, canonical или настройках SEO-плагина. Типичный симптом — страница доступна по прямой ссылке, но всё равно регулярно появляется в XML sitemap и уходит в обход поисковикам как приоритетная для обхода.

Что проверить перед правкой кода

  • Откройте /wp-sitemap.xml или sitemap от SEO-плагина и найдите проблемный URL.
  • Проверьте, не генерируется ли он плагином SEO отдельно от ядра WordPress.
  • Убедитесь, что страница не исключена только через noindex — это не убирает её из sitemap автоматически.
  • Посмотрите, не является ли URL архивом, а не записью или страницей.

Если URL попадает в sitemap ядра WordPress, фильтры ниже подойдут. Если sitemap генерирует SEO-плагин, логика будет похожей, но хук может быть другим.

Как исключить записи и страницы из sitemap по ID

Самый надёжный вариант — исключать конкретные объекты по ID. Это удобно для служебных страниц, которые не должны индексироваться и не должны попадать в карту сайта, но при этом нужны на сайте.

<?php
add_filter( 'wp_sitemaps_posts_query_args', function( $args, $post_type ) {
    $exclude_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( $args['post__not_in'], $exclude_ids )
            : $exclude_ids;
    }

    return $args;
}, 10, 2 );

Этот код можно добавить в functions.php дочерней темы или в свой мини-плагин. Логика простая: WordPress при сборке sitemap для постов и страниц получит список исключений и не включит их в выдачу.

Если у вас много исключаемых страниц, лучше хранить их в одном массиве и не размазывать по нескольким фильтрам. Так проще поддерживать и проверять изменения.

Как убрать из sitemap целый тип записей или архив

Иногда проблема не в отдельных URL, а в том, что в sitemap попадает целый тип контента: например, служебные записи, технические материалы или кастомный post type, который не должен индексироваться. В этом случае удобнее отключить его на уровне генерации sitemap.

<?php
add_filter( 'wp_sitemaps_post_types', function( $post_types ) {
    unset( $post_types['news'] );
    unset( $post_types['landing'] );

    return $post_types;
} );

Такой подход работает, если вы уверены, что тип записи не должен присутствовать в sitemap вообще. Если нужно исключить только часть материалов, используйте фильтрацию по ID или по метаполю.

Исключение по метаполю или статусу

Для проектов с редакционным процессом часто удобнее помечать записи специальным полем, например exclude_from_sitemap. Тогда редактор может сам управлять попаданием страницы в карту сайта без правки кода каждый раз.

<?php
add_filter( 'wp_sitemaps_posts_query_args', function( $args, $post_type ) {
    $args['meta_query'] = array(
        array(
            'key'     => 'exclude_from_sitemap',
            'compare' => 'NOT EXISTS',
        ),
    );

    return $args;
}, 10, 2 );

Этот вариант требует аккуратности: если вы уже используете meta_query в другом коде, нужно объединять условия, а не перетирать их. Иначе можно случайно скрыть из sitemap больше контента, чем планировали.

Сравнение подходов

СпособКогда подходитМинус
Исключение по IDНесколько конкретных страницНужно вручную поддерживать список
Отключение типа записиЦелый CPT не должен индексироватьсяНе подходит для точечных исключений
Флаг в метаполеКонтентом управляют редакторыНужно следить за логикой сохранения поля

Пошаговое решение без лишнего риска

  1. Определите, какие именно URL должны исчезнуть из sitemap.
  2. Проверьте, генерирует ли sitemap ядро WordPress или SEO-плагин.
  3. Выберите способ исключения: по ID, по типу записи или по метаполю.
  4. Добавьте код в дочернюю тему или мини-плагин, а не в основной файл темы.
  5. Очистите кеш, если он есть на сайте или на уровне сервера.
  6. Переоткройте XML sitemap и убедитесь, что URL больше не присутствует.

Как проверить, что решение сработало

Проверка должна быть не визуальной “на глаз”, а по конкретному URL. Откройте sitemap в браузере и найдите исключённую страницу поиском по странице. Если у вас несколько sitemap-файлов, проверьте и индексную карту, и дочерние файлы.

Дополнительно полезно проверить HTTP-ответ и кеш:

  • страница sitemap отдаётся без старой версии из кеша;
  • исключённый URL не возвращается в XML;
  • после обновления записи она не появляется снова из-за другого фильтра или плагина;
  • если используется SEO-плагин, его sitemap не дублирует карту WordPress.

Для быстрой диагностики можно временно открыть sitemap в режиме инкогнито или через curl, чтобы исключить влияние браузерного кеша:

curl -I https://example.com/wp-sitemap.xml

Частые ошибки и как их исправить

Код добавили не туда

Если вставить фильтр в активную тему, а потом сменить тему, исключения исчезнут. Для стабильности лучше использовать дочернюю тему или небольшой плагин под сайт.

Проверяют только robots.txt

robots.txt не убирает URL из sitemap. Он лишь ограничивает обход. Если URL уже есть в XML, поисковик всё равно видит его как часть структуры сайта.

Смешивают sitemap ядра и SEO-плагина

У WordPress и у SEO-плагина могут быть разные карты сайта. Если правка сделана для ядра, а в выдаче виден sitemap от плагина, кажется, что ничего не изменилось. Сначала определите источник XML.

Не очищают кеш

После изменения фильтра старый XML может продолжать отдаваться из кеша страницы, CDN или сервера. Это особенно заметно на крупных сайтах.

Безопасность и производительность

Фильтры для sitemap не тяжёлые сами по себе, но не стоит делать сложные запросы к базе на каждом вызове. Если список исключений большой, лучше хранить его в массиве или в опции и не строить тяжёлую логику внутри фильтра.

Если вы работаете с чувствительным контентом, не полагайтесь только на исключение из sitemap. Служебные страницы должны быть закрыты и на уровне доступа, и на уровне индексации, если это действительно нужно.

Для сайтов, где нужно регулярно управлять дублями, служебными страницами и технической чисткой, удобнее держать логику в одном месте. Если нужен набор инструментов для SEO-правок и удаления лишних сущностей, можно посмотреть Clearfy Pro: https://wpshop.ru/plugins/clearfy.

Главное здесь не “спрятать” страницу, а убрать её из карты сайта осознанно и проверить, что она не возвращается через другой источник генерации XML.

Как отключить эмодзи в WordPress через код и плагин
16.09.2026
Как убрать дубли страниц в WordPress от пагинации, фильтров и архивов
02.09.2026
Как закрыть от индексации старые версии страниц в WordPress
25.09.2026
Как отключить XML sitemap для отдельных типов записей в WordPress
19.09.2026
Как отключить XML-RPC в WordPress и не сломать внешние сервисы
12.09.2026