wplang.ru wordpress WP Lang

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

Ситуация типовая: карта сайта в 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, но и фактическую отдачу страницы.

  1. Откройте XML sitemap в браузере и убедитесь, что URL исчез.
  2. Проверьте исходный код страницы: нет ли там noindex, если он нужен.
  3. Посмотрите заголовки ответа, если используете серверные правила.
  4. В 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.

×
-15%
на премиум-тему
Bono

Создай магазин мечты
на WordPress!

↓ ↓ ↓ ↓ ↓
Купить со скидкой »