Как отключить XML-sitemaps в WordPress и заменить их на свой вариант

Стандартные XML-sitemaps в WordPress полезны до тех пор, пока не начинают мешать. Типичный сценарий: у сайта уже есть SEO-плагин, который генерирует собственную карту сайта, а ядро WordPress с версии 5.5 тоже отдает /wp-sitemap.xml. В итоге поисковику показываются две карты, в логах появляются лишние обращения, а в панели вебмастера приходится разбираться, какая из них вообще должна быть основной.

Если задача не просто «выключить что-то лишнее», а оставить один понятный источник sitemap, лучше сразу решить, кто именно будет его формировать: ядро, SEO-плагин или ваш код. Ниже — рабочие варианты без выдуманных хуков и без опасных правок ядра.

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

Проблема обычно всплывает не сразу. Сайт может нормально работать, но при проверке индексации видно, что поисковик ходит и в /wp-sitemap.xml, и в карту сайта от плагина. Это особенно заметно на проектах, где:

  • уже установлен Yoast SEO, Rank Math или другой SEO-плагин со своей sitemap;
  • нужно исключить часть контента из карты сайта на уровне кода;
  • есть нестандартные типы записей, которые не должны попадать в индекс;
  • после миграции остались старые правила и несколько источников sitemap;
  • в robots.txt указаны сразу две карты сайта, и это путает диагностику.

Если оставить всё как есть, это не всегда критично, но в техническом SEO лишняя неоднозначность почти никогда не помогает.

Диагностика: что именно отдает карту сайта

Сначала проверьте, кто формирует sitemap сейчас. Это можно сделать без доступа к базе и без установки дополнительных инструментов.

Проверка в браузере и по заголовкам

Откройте /wp-sitemap.xml. Если видите XML-индекс WordPress с разделами по типам контента, значит карту отдает ядро. Если там редирект на другой адрес или XML в формате SEO-плагина, значит источник другой.

Полезно посмотреть и заголовки ответа:

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

Если ответ 200 OK и содержимое похоже на стандартный sitemap index WordPress, отключать нужно именно встроенную генерацию. Если там 301 или 302, сначала разберитесь, кто делает редирект: плагин, сервер или правила в .htaccess/nginx.

Проверка конфликтов с SEO-плагином

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

ВариантЧто делаетКогда подходитКомпромисс
Оставить встроенную sitemapWordPress сам генерирует /wp-sitemap.xmlНет SEO-плагина, нужен базовый вариантМеньше контроля над составом
Отключить ядро и использовать SEO-плагинОстается одна карта сайтаНа сайте уже есть SEO-плагинЗависимость от плагина
Свой кодПолный контроль над составом sitemapНестандартные требованияНужно поддерживать код

Как отключить встроенные XML-sitemaps WordPress

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

<?php
add_filter( 'wp_sitemaps_enabled', '__return_false' );

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

Почему лучше не править ядро

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

Если нужна своя карта сайта: минимальный рабочий вариант

Иногда стандартная sitemap не подходит: нужно исключить часть записей, собрать отдельный список URL или отдать карту только для определенного типа контента. Тогда можно сделать собственный endpoint через rewrite и вывести XML вручную. Ниже — упрощенный пример для отдельной карты /sitemap-custom.xml.

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

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

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

    nocache_headers();
    header( 'Content-Type: application/xml; charset=UTF-8' );

    echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
    echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";

    foreach ( $posts as $post_id ) {
        echo "  <url>\n";
        echo '    <loc>' . esc_url( get_permalink( $post_id ) ) . "</loc>\n";
        echo '    <lastmod>' . esc_html( get_post_modified_time( 'c', true, $post_id ) ) . "</lastmod>\n";
        echo "  </url>\n";
    }

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

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

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

  1. Определите, какая sitemap должна остаться основной: ядро WordPress, SEO-плагин или свой endpoint.
  2. Если используете SEO-плагин, проверьте его настройки sitemap и отключите встроенную карту WordPress через wp_sitemaps_enabled.
  3. Если нужен собственный XML, создайте отдельный URL и не смешивайте его с системным /wp-sitemap.xml.
  4. Обновите robots.txt, чтобы там осталась только одна актуальная ссылка на sitemap.
  5. Проверьте ответ сервера: код 200, корректный XML, отсутствие редиректов и ошибок.
  6. Отправьте в Search Console только тот sitemap, который действительно должен индексироваться.

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

Проверка должна быть не только визуальной. Нужны конкретные признаки, что старый источник отключен, а новый работает стабильно.

  • /wp-sitemap.xml больше не открывается, если вы отключали ядро;
  • новый sitemap отдает 200 OK и валидный XML;
  • в robots.txt указан только один актуальный адрес карты сайта;
  • в Search Console не появляется дублирующаяся карта с одинаковым набором URL;
  • в логах сервера нет регулярных 404 на старый sitemap-адрес.

Для быстрой проверки можно использовать:

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

Если первый запрос возвращает 404 или пустой ответ, а второй — корректный XML, значит схема работает так, как задумано.

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

Отключили sitemap, но забыли про SEO-плагин

Иногда встроенную карту WordPress выключают, а карта от плагина тоже не включена. В результате поисковик получает пустой или недоступный адрес. Проверьте настройки SEO-плагина до того, как отключать ядро.

Остался старый адрес в robots.txt

Если в robots.txt указан /wp-sitemap.xml, поисковик продолжит ходить туда, даже если карта уже отключена. Уберите старую строку и оставьте только актуальный URL.

Не сбросили правила перезаписи

После добавления собственного sitemap-эндпоинта новый URL может не открываться из-за старых rewrite rules. Обновите постоянные ссылки в админке или выполните сброс правил другим штатным способом, если он у вас уже используется в проекте.

Смешали XML и HTML в одном шаблоне

Если sitemap генерируется через шаблон темы, легко случайно вывести лишние пробелы, HTML-комментарии или BOM. Для XML это критично: файл может стать невалидным. Лучше отдавать sitemap через отдельный обработчик и сразу задавать Content-Type: application/xml.

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

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

Если вы пишете собственный генератор, не отдавайте в sitemap черновики, приватные записи и служебные URL. Проверяйте post_status, тип записи и канонический permalink. И не забывайте, что sitemap — это публичный XML-файл, поэтому туда не должны попадать внутренние адреса, которые вы не хотите светить наружу.

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

Главная идея простая: не держите два источника sitemap одновременно без необходимости. Один понятный XML-файл легче поддерживать, проще проверять и меньше шансов, что он начнет конфликтовать с остальной SEO-настройкой сайта.

⭐⭐⭐⭐⭐