Как отключить XML sitemap в WordPress без поломки индексации

Стандартная XML sitemap в WordPress обычно не мешает, но в реальных проектах она начинает конфликтовать с кастомной логикой: отдельным sitemap от SEO-плагина, нестандартными типами записей, закрытыми разделами, мультиязычностью или генерацией карт сайта на уровне сервера. В таких случаях важно не просто «выключить карту», а сделать это так, чтобы поисковые системы не потеряли актуальный источник URL.

Когда стандартная sitemap действительно лишняя

В WordPress с версии 5.5 встроенная XML-карта сайта включена по умолчанию. Если на сайте уже работает Yoast SEO, Rank Math, All in One SEO или другой SEO-плагин с собственной генерацией sitemap, вы получаете дублирование. Это не всегда критично, но часто создаёт лишний шум: в индексе появляются разные URL карт, а в логах и Search Console сложнее отслеживать, какая версия sitemap реально используется.

Есть и более практичные сценарии:

  • нужно полностью управлять списком URL через SEO-плагин или серверную генерацию;
  • часть контента закрыта от индексации, а встроенная sitemap продолжает отдавать эти URL;
  • на проекте есть кастомные post type и таксономии, которые удобнее собирать отдельной логикой;
  • высокая нагрузка на сайт, и вы хотите убрать лишнюю генерацию XML на лету.

Диагностика: что именно сейчас отдаёт sitemap

Перед изменениями проверьте, кто формирует карту сайта. У WordPress по умолчанию это адрес /wp-sitemap.xml. Если SEO-плагин активен, у него обычно свой набор URL, например /sitemap_index.xml у Yoast SEO или похожий индекс у других решений.

Проверка простая:

  1. Откройте /wp-sitemap.xml в браузере.
  2. Проверьте, отдаётся ли XML и какие разделы внутри перечислены.
  3. Сравните с sitemap SEO-плагина.
  4. Посмотрите, нет ли в Search Console нескольких карт сайта, которые ведут к одному и тому же набору URL.

Если /wp-sitemap.xml доступен, а вы используете отдельную sitemap от SEO-плагина, встроенную карту лучше отключить или хотя бы убрать из публичного доступа.

Как отключить встроенную XML sitemap в WordPress

Самый безопасный способ — отключить генерацию через фильтр wp_sitemaps_enabled. Это штатный механизм WordPress, без правки ядра.

add_filter( 'wp_sitemaps_enabled', '__return_false' );

Код можно добавить в functions.php дочерней темы, в небольшой mu-plugin или в собственный плагин. Для продакшена mu-plugin обычно удобнее: он не зависит от темы и не исчезнет при обновлении.

Вариант через mu-plugin

Создайте файл, например wp-content/mu-plugins/disable-wp-sitemaps.php, и добавьте туда:

<?php
/**
 * Disable WordPress core XML sitemaps.
 */
add_filter( 'wp_sitemaps_enabled', '__return_false' );

После этого /wp-sitemap.xml должен отдавать 404 или пустой ответ в зависимости от конфигурации и кэша. Если страница продолжает открываться, проверьте кэш плагина, серверный кэш и CDN.

Чем заменить встроенную sitemap

Если у вас уже есть SEO-плагин, обычно лучше оставить только его sitemap. Это проще для поддержки: одна точка управления, один индекс, один набор правил исключения.

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

ПодходКогда подходитПлюсыМинусы
Отключить core sitemap и оставить SEO-плагинНа сайте уже есть Yoast SEO, Rank Math или аналогПросто, предсказуемо, меньше дублейНужно следить за настройками плагина
Отключить core sitemap и сделать своюЕсть кастомная логика индексацииПолный контроль над URLНужно поддерживать код
Оставить обе картыПочти никогда не нужноНичего не менятьДубли, путаница, лишняя нагрузка

Если нужен свой sitemap index

Когда проекту нужна отдельная карта сайта, лучше не пытаться «допилить» core sitemap, а отдать свой XML-ответ через rewrite и шаблонный вывод. Ниже упрощённый пример для отдельного URL /custom-sitemap.xml. Он не заменяет полноценный sitemap-плагин, но показывает рабочий принцип.

add_action( 'init', function () {
    add_rewrite_rule( '^custom-sitemap\.xml$', 'index.php?custom_sitemap=1', 'top' );
    add_rewrite_tag( '%custom_sitemap%', '([0-1])' );
} );

add_action( 'template_redirect', function () {
    if ( (int) get_query_var( 'custom_sitemap' ) !== 1 ) {
        return;
    }

    $posts = get_posts( array(
        'post_type'      => array( 'post', 'page' ),
        'post_status'    => 'publish',
        'posts_per_page' => 200,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    ) );

    nocache_headers();
    header( 'Content-Type: application/xml; charset=UTF-8' );
    echo '<?xml version="1.0" encoding="UTF-8"?>';
    echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';

    foreach ( $posts as $post_id ) {
        echo '<url>';
        echo '<loc>' . esc_url( get_permalink( $post_id ) ) . '</loc>';
        echo '</url>';
    }

    echo '</urlset>';
    exit;
} );

После добавления rewrite-правила не забудьте обновить постоянные ссылки в админке или вручную сбросить правила. Иначе новый URL не начнёт работать.

Проверка результата после внедрения

Отключение sitemap считается успешным только тогда, когда это подтверждается не одним, а несколькими способами.

  • Откройте /wp-sitemap.xml и проверьте, что он больше не отдаёт XML.
  • Если вы оставили sitemap SEO-плагина, убедитесь, что именно она доступна и содержит нужные URL.
  • Проверьте исходный код страниц и robots.txt: там не должно быть старых ссылок на отключённую карту.
  • В Search Console посмотрите, что в отчётах по sitemap осталась только актуальная карта.

Если сайт за CDN или с агрессивным кэшем, очистите кэш после изменений. Иначе вы можете увидеть старую XML ещё несколько часов, хотя на сервере она уже отключена.

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

Отключили sitemap, но она всё ещё открывается

Чаще всего виноват кэш: плагин кэширования, серверный reverse proxy или CDN. Очистите все уровни кэша и проверьте ответ напрямую, минуя браузерный кэш.

Выключили core sitemap, а SEO-плагин тоже перестал отдавать XML

Такое бывает, если вы добавили код не туда или отключили не тот механизм. Убедитесь, что фильтр wp_sitemaps_enabled влияет только на встроенную карту WordPress, а не на плагин. У SEO-плагинов обычно свой генератор и свой URL.

После добавления rewrite-правила URL даёт 404

Нужно сбросить правила постоянных ссылок. В админке откройте Настройки → Постоянные ссылки и сохраните их без изменений. Если используете код, проверьте, что query var зарегистрирован корректно.

В sitemap попадают закрытые страницы

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

Что учесть по безопасности и производительности

Если sitemap генерируется на лету, не делайте тяжёлые запросы без необходимости. Для больших сайтов лучше разбивать карту на несколько файлов и не вытаскивать лишние поля. В примерах выше использован fields => 'ids' и no_found_rows => true — это снижает нагрузку на запрос.

Для проектов, где важна чистка технических дублей и контроль индексации, удобно держать логику в одном месте. Например, часть задач по удалению дублей, отключению лишних функций WordPress и управлению SEO-настройками можно закрывать через Clearfy Pro, если он уже используется в проекте. Но даже в этом случае полезно понимать, какой именно механизм отключает sitemap и где он живёт — в ядре, теме или плагине.

Если вы меняете sitemap на рабочем сайте, делайте это в такой последовательности: сначала подготовьте замену, потом отключите встроенную карту, затем проверьте ответ сервера и только после этого обновляйте Search Console. Так проще поймать ошибку, если что-то пошло не так.

⭐⭐⭐⭐⭐