WordPress Notes WPTips

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

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

Когда встроенный sitemap лучше отключить

Стандартный sitemap WordPress генерируется ядром и подходит для простых сайтов. Но на практике его часто приходится отключать, если:

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

Если оставить сразу два источника, поисковик обычно не «ломается», но вы сами усложняете диагностику: непонятно, какой sitemap реально используется, где именно появился лишний URL и почему изменения в robots.txt не дают ожидаемого эффекта.

Диагностика: что именно конфликтует

Перед правкой кода проверьте базовые вещи. Это экономит время и помогает не отключить лишнее.

  1. Откройте /wp-sitemap.xml и посмотрите, отдаёт ли WordPress встроенную карту сайта.
  2. Проверьте sitemap SEO-плагина, если он установлен: у Yoast это обычно /sitemap_index.xml, у Rank Math — свой индекс карт сайта.
  3. Сравните список URL: нет ли там одинаковых записей, архивов или медиа-страниц.
  4. Посмотрите, не закрыты ли нужные типы записей через noindex или настройки плагина, но при этом они всё равно попадают в sitemap.
  5. Проверьте ответ сервера: sitemap должен отдавать 200 OK, а не редиректить на другой адрес или возвращать HTML-страницу ошибки.

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

Как отключить XML sitemap в WordPress через код

Начиная с WordPress 5.5 встроенный sitemap можно отключить фильтром wp_sitemaps_enabled. Это самый чистый способ, если вы хотите полностью передать генерацию карты сайта SEO-плагину или своему коду.

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

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

Когда лучше использовать mu-plugin

Если отключение sitemap — часть технической политики сайта, не привязывайте её к теме. Mu-plugin загружается независимо от шаблона и меньше рискует «потеряться» после обновления. Для таких задач это практичнее, чем правка активной темы.

<?php
/**
 * Plugin Name: Disable Core XML Sitemap
 */
add_filter( 'wp_sitemaps_enabled', '__return_false' );

Как заменить встроенный sitemap своим вариантом

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

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

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

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

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

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

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

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

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

После добавления rewrite rule обязательно обновите постоянные ссылки в админке или выполните flush правил через обычное сохранение настроек. Иначе URL /custom-sitemap.xml может не заработать сразу.

Сравнение подходов: плагин, код, компромисс

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

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

  1. Определите, кто должен быть единственным источником sitemap: ядро WordPress, SEO-плагин или ваш код.
  2. Если sitemap нужен не от ядра, отключите его фильтром wp_sitemaps_enabled.
  3. Проверьте настройки SEO-плагина: включён ли индекс sitemap, не дублируются ли типы записей.
  4. Если нужен свой sitemap, сделайте отдельный endpoint и отдавайте только опубликованный контент.
  5. Обновите правила перезаписи, если добавляли новый URL.
  6. Проверьте ответ в браузере и через curl.
curl -I https://example.com/wp-sitemap.xml
curl -I https://example.com/custom-sitemap.xml

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

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

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

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

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

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

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

Добавили код в тему и потеряли его после обновления

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

Не обновили rewrite rules

Новый endpoint существует в коде, но URL даёт 404. Обычно причина в том, что правила перезаписи не были обновлены после добавления add_rewrite_rule().

В sitemap попадают noindex-страницы

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

Практические советы по безопасности и производительности

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

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

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

×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее