Встроенная XML-карта сайта в WordPress часто мешает не сама по себе, а в связке с SEO-плагином, кастомными типами записей или отдельной логикой индексации. Типичный сценарий: в поисковик уходит сразу две карты сайта, часть URL дублируется, а в robots.txt и Search Console появляются разные источники sitemap. Если у вас уже есть Yoast SEO, Rank Math, Clearfy Pro или своя генерация карты сайта, встроенный механизм WordPress лучше отключить и оставить один понятный источник.
Ниже — практический разбор: как понять, что именно конфликтует, чем отключать встроенную sitemap, как проверить результат и где чаще всего ломают индексацию.
Когда встроенная XML Sitemap действительно мешает
Сам факт наличия /wp-sitemap.xml не ошибка. Проблема начинается, когда поисковик видит несколько карт сайта с пересекающимися URL или когда одна из карт отдает лишние типы контента: вложения, служебные страницы, архивы без ценности. Тогда в отчётах появляются дубли, а в логике индексации становится сложнее понять, что именно вы хотите продвигать.
Признаки конфликта
- в
robots.txtуказан один sitemap, а в браузере открывается ещё и/wp-sitemap.xml; - SEO-плагин уже генерирует собственную карту сайта, но WordPress продолжает отдавать встроенную;
- в Search Console появляются разные источники sitemap с пересекающимися URL;
- в карте сайта есть записи, которые вы уже закрыли от индексации в плагине или кодом;
- после обновления WordPress меняется поведение sitemap без вашего участия.
Что проверить перед изменениями
Сначала посмотрите, кто именно сейчас отвечает за sitemap. Это можно сделать без доступа к базе: откройте /wp-sitemap.xml, проверьте robots.txt и настройки SEO-плагина. Если плагин уже генерирует карту сайта, встроенную лучше отключить, а не пытаться «подправить» обе сразу.
| Подход | Когда уместен | Минус |
|---|---|---|
| Оставить встроенную sitemap WordPress | Простой сайт без SEO-плагина и без сложной структуры | Мало гибкости для исключений |
| Отключить встроенную и использовать SEO-плагин | Есть Yoast SEO, Rank Math или другой генератор | Нужно следить, чтобы не было второй карты |
| Сделать свою генерацию кодом | Нужны нестандартные правила для CPT, таксономий и фильтров | Больше ответственности за поддержку |
Как отключить встроенную карту сайта WordPress
В WordPress 5.5+ встроенная XML Sitemap включена по умолчанию. Самый чистый способ отключить её — через фильтр wp_sitemaps_enabled. Это безопаснее, чем править ядро или пытаться блокировать URL через robots.txt.
Вариант через functions.php
Если у вас дочерняя тема или отдельный mu-plugin, добавьте такой код:
<?php
add_filter( 'wp_sitemaps_enabled', '__return_false' );После этого /wp-sitemap.xml должен перестать открываться как карта сайта WordPress. Если у вас уже есть SEO-плагин, он продолжит отдавать свою sitemap отдельно.
Вариант через мини-плагин
Для продакшена удобнее вынести это в отдельный mu-plugin, чтобы настройка не зависела от темы:
<?php
/**
* Plugin Name: Disable Core XML Sitemap
*/
add_filter( 'wp_sitemaps_enabled', '__return_false' );Файл можно положить в wp-content/mu-plugins/disable-core-sitemap.php. Такой вариант не отключится случайно после смены темы.
Если нужна своя карта сайта, а не просто отключение
Иногда встроенную sitemap отключают не ради SEO-плагина, а чтобы отдать поисковику только нужные URL: например, записи определённого типа, страницы каталога знаний или отдельные языковые версии. В таком случае лучше не создавать «вторую случайную sitemap», а сразу определить правила генерации.
Минимальный пример своей sitemap на основе WP_Query
Ниже упрощённый пример, который выводит XML для опубликованных записей. Это не полноценный генератор для большого проекта, но как основа для кастомной логики подходит:
<?php
add_action( 'init', function () {
add_rewrite_rule( '^custom-sitemap\.xml$', 'index.php?custom_sitemap=1', 'top' );
} );
add_filter( 'query_vars', function ( $vars ) {
$vars[] = 'custom_sitemap';
return $vars;
} );
add_action( 'template_redirect', function () {
if ( (int) get_query_var( 'custom_sitemap' ) !== 1 ) {
return;
}
nocache_headers();
header( 'Content-Type: application/xml; charset=UTF-8' );
$query = new WP_Query( array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => 1000,
'no_found_rows' => true,
) );
echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
while ( $query->have_posts() ) {
$query->the_post();
echo '<url>';
echo '<loc>' . esc_url( get_permalink() ) . '</loc>';
echo '<lastmod>' . esc_html( get_post_modified_time( 'c', true ) ) . '</lastmod>';
echo '</url>';
}
wp_reset_postdata();
echo '</urlset>';
exit;
} );Здесь важно не копировать пример как есть в большой проект без доработки. Для реального сайта нужно ограничить типы записей, исключить черновики, продумать пагинацию sitemap и не отдавать тысячи URL одним ответом, если сайт крупный.
Пошаговое решение без лишних рисков
- Определите, кто сейчас генерирует sitemap: ядро WordPress, SEO-плагин или кастомный код.
- Если используется SEO-плагин, проверьте его настройки sitemap и отключите встроенную карту WordPress через
wp_sitemaps_enabled. - Убедитесь, что в
robots.txtуказан только один актуальный адрес sitemap. - Очистите кеш страницы, объектный кеш и CDN, если они есть.
- Проверьте ответ
/wp-sitemap.xmlи URL вашей новой карты сайта. - Обновите sitemap в Search Console, если адрес изменился.
Если sitemap отдаётся через кеш
Иногда после отключения встроенной карты сайт продолжает отдавать старый XML из кеша. Это не баг WordPress, а следствие кеширования на уровне плагина, сервера или CDN. В таком случае сначала очищают кеш, а потом повторно проверяют URL в режиме инкогнито или через curl.
curl -I https://example.com/wp-sitemap.xmlЕсли ответ всё ещё 200 OK и в теле XML старого формата, значит кеш не сброшен или правило переписывания осталось активным.
Как проверить, что решение сработало
Проверка должна быть не на уровне «страница открывается», а на уровне фактического поведения. Смотрите на статус ответа, содержимое XML и список sitemap в Search Console.
- Откройте
/wp-sitemap.xml— он не должен показывать карту WordPress, если вы её отключали. - Проверьте
robots.txt— там должен быть один понятный sitemap-адрес. - Сравните URL в старой и новой карте сайта: не должно быть пересечений без причины.
- Посмотрите Search Console: нет ли ошибок чтения sitemap или дублирующих источников.
- Проверьте несколько URL из карты вручную: они должны открываться с кодом
200и без редиректов на технические страницы.
Если у вас есть доступ к логам сервера, полезно посмотреть, как поисковый бот запрашивает sitemap после изменения. Это помогает поймать редиректы, 404 и проблемы с кешем раньше, чем они попадут в отчёты.
Частые ошибки и как их исправить
Отключили sitemap в robots.txt, но не в WordPress
Это не решает проблему. Поисковик может всё равно найти /wp-sitemap.xml напрямую. Правильнее отключать генерацию через фильтр, а не только скрывать адрес.
Оставили две карты сайта одновременно
Так часто бывает после установки SEO-плагина поверх уже работающего сайта. В итоге одна карта живёт в ядре, вторая — в плагине. Нужно оставить один источник и явно выключить второй.
Забыли про кеш
После правки кодом старый XML может ещё какое-то время отдаваться из кеша. Если проверять только в браузере, легко решить, что фильтр не сработал. Очистите кеш плагина, серверный кеш и CDN.
Сделали свой sitemap без пагинации
На небольшом сайте это может пройти незаметно, но на большом проекте один огромный XML быстро становится неудобным и для сервера, и для поисковика. Лучше сразу проектировать sitemap с разбиением на части.
Закрыли sitemap в noindex
XML-карта сайта не индексируется как обычная HTML-страница, поэтому noindex тут не основной инструмент. Если вам нужно убрать карту из обхода, отключайте её генерацию или корректно управляйте доступом к URL.
Безопасность и производительность
Если вы отключаете встроенную sitemap ради кастомной логики, не делайте это через правку ядра. После обновления WordPress изменения затрутся, а сайт может внезапно вернуть старое поведение. Для постоянной настройки используйте mu-plugin или дочернюю тему, если это действительно часть темы.
Для производительности полезно помнить ещё одну вещь: sitemap не должен строиться тяжёлым запросом на каждом обращении. Если сайт крупный, лучше кэшировать результат или генерировать файл заранее, а не собирать XML на лету для тысяч записей.
Если вам нужен более широкий набор технических правок — отключение дублей, чистка служебных ссылок, управление sitemap и другими SEO-настройками — такие задачи удобно собирать в одном инструменте вроде Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но даже с плагином полезно понимать, какой именно механизм вы отключаете и где у него источник.
Когда лучше не трогать встроенную sitemap
Если сайт маленький, SEO-плагина нет, а структура простая, встроенной карты WordPress может быть достаточно. В таком случае не стоит усложнять стек только ради «идеальной архитектуры». Отключать её имеет смысл тогда, когда есть конкретная причина: конфликт, дубли, нестандартные правила или единая SEO-логика в одном плагине.
Главный ориентир простой: у поисковика должен быть один понятный источник sitemap, а у вас — один способ управлять тем, что туда попадает.