Встроенная XML-карта сайта в WordPress удобна до тех пор, пока не начинает конфликтовать с SEO-плагином, отдавать лишние URL или мешать вашей логике индексации. Типичный сценарий: в поиске уже есть sitemap от Yoast, Rank Math или другого плагина, а ядро WordPress с версии 5.5 продолжает отдавать /wp-sitemap.xml. В итоге поисковик видит несколько карт сайта, а вы тратите время на разбор дублей и лишних обходов.
Ниже разберём, как понять, что именно мешает, как отключить встроенный sitemap без поломки сайта и как проверить результат после внедрения. Если нужен не только запрет, но и свой файл карты сайта, покажу рабочий вариант через код.
Когда встроенный sitemap WordPress становится проблемой
Сам по себе /wp-sitemap.xml не ошибка. Проблема возникает, когда у сайта уже есть другой источник sitemap или когда вы хотите жёстко контролировать, какие типы записей попадают в индекс. На практике это встречается в трёх случаях:
- SEO-плагин уже генерирует собственный sitemap, а ядро WordPress отдаёт ещё один;
- в sitemap попадают таксономии, архивы или типы записей, которые вы не хотите индексировать;
- нужно отдать свой XML-файл, например собранный из нескольких источников или внешней системы.
Диагностика проблемы
Сначала проверьте, что именно открывается по адресу /wp-sitemap.xml. Если там есть XML-индекс WordPress, а рядом в SEO-плагине уже включена собственная карта сайта, у вас дублирование источников. Затем посмотрите, какие URL реально отдаются в sitemap: иногда проблема не в самом файле, а в том, что в него попадают служебные страницы, медиа-архивы или пустые таксономии.
Полезно проверить и заголовки ответа. Если sitemap отдаёт 200 OK, но при этом вы ожидаете редирект или 404, значит отключение не сработало. Для быстрой проверки подойдёт:
curl -I https://example.com/wp-sitemap.xmlЕсли у вас включён SEO-плагин, сравните его sitemap-адрес с адресом ядра WordPress. Часто именно здесь и находится конфликт.
Как отключить встроенный XML Sitemap в WordPress
Надёжный способ — отключить генерацию sitemap через фильтр wp_sitemaps_enabled. Это штатный фильтр ядра, он не требует правки core-файлов и нормально живёт в теме или в небольшом mu-plugin.
Если вы работаете в дочерней теме, добавьте код в functions.php. Если хотите, чтобы настройка не зависела от темы, лучше вынести её в mu-plugins.
<?php
add_filter( 'wp_sitemaps_enabled', '__return_false' );После этого WordPress перестанет генерировать /wp-sitemap.xml и связанные с ним подкарты. Это именно отключение встроенного механизма, а не блокировка через robots.txt. Для SEO это обычно безопаснее: поисковик просто не увидит лишний sitemap, а не получит запрет на обход важных URL.
Вариант через mu-plugin
Если не хотите привязывать поведение к теме, создайте файл, например wp-content/mu-plugins/disable-wp-sitemap.php:
<?php
/**
* Plugin Name: Disable WP Sitemap
*/
add_filter( 'wp_sitemaps_enabled', '__return_false' );Такой вариант удобнее для проектов, где тема может меняться, а техническая политика индексации должна оставаться прежней.
Как заменить sitemap на свой вариант
Если вам нужен собственный XML, не пытайтесь «дописывать» его в ядро. Проще и чище создать отдельный endpoint или статический файл, который будет отдавать нужные URL. Для небольшого проекта достаточно собственного шаблона на template_redirect и заголовка Content-Type: application/xml.
Ниже пример: при запросе /custom-sitemap.xml WordPress отдаёт XML со списком опубликованных записей. Это не полноценная замена для больших сайтов, но рабочая база для узкого сценария.
<?php
add_action( 'template_redirect', function () {
if ( ! is_page( 'custom-sitemap.xml' ) ) {
return;
}
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">';
$posts = get_posts( array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => 1000,
'fields' => 'ids',
'no_found_rows' => true,
) );
foreach ( $posts as $post_id ) {
echo '<url>';
echo '<loc>' . esc_url( get_permalink( $post_id ) ) . '</loc>';
echo '<lastmod>' . esc_html( get_post_modified_time( 'c', true, $post_id ) ) . '</lastmod>';
echo '</url>';
}
echo '</urlset>';
exit;
} );Этот пример намеренно простой. Для реального проекта лучше делать отдельный rewrite rule и endpoint, а не опираться на страницу с таким слагом. Но как рабочая схема для проверки логики он подходит.
Что выбрать: плагин, код или компромисс
| Подход | Когда подходит | Минусы |
|---|---|---|
| SEO-плагин | Нужна готовая карта сайта и управление индексацией из админки | Может конфликтовать с ядром, если не отключить встроенный sitemap |
| Код | Нужен полный контроль над URL и логикой генерации | Нужно следить за обновлениями и тестировать вручную |
| Комбинированный вариант | SEO-плагин отвечает за sitemap, ядро отключено | Важно не забыть про одну точку правды |
Проверка результата после внедрения
После отключения встроенного sitemap проверьте не только открытие URL в браузере. Нужны три проверки:
- адрес
/wp-sitemap.xmlбольше не отдаёт XML WordPress; - ваш основной sitemap открывается с кодом ответа
200; - в sitemap нет лишних типов контента и пустых архивов.
Для быстрой проверки используйте:
curl -I https://example.com/wp-sitemap.xml
curl -I https://example.com/sitemap_index.xmlЕсли используете Google Search Console или другой инструмент для вебмастеров, отправьте туда именно тот sitemap, который должен быть основным. Не держите в индексации сразу несколько карт сайта без необходимости: это не всегда критично, но почти всегда создаёт лишний шум в отчётах.
Частые ошибки и как их исправить
Отключили sitemap через robots.txt
Это частая ошибка. Запрет в robots.txt не отключает генерацию sitemap, а только ограничивает обход. Если файл уже существует и его кто-то знает, поисковик всё равно может его увидеть. Для отключения нужен фильтр wp_sitemaps_enabled или отключение в SEO-плагине.
Удалили файл темы, а не добавили фильтр
Правка core-файлов или случайное удаление шаблонов не решает задачу. После обновления WordPress всё вернётся обратно. Используйте только фильтр, mu-plugin или настройки SEO-плагина.
Оставили включёнными два генератора sitemap
Если SEO-плагин уже создаёт sitemap, а встроенный WordPress не отключён, вы получаете дублирование. Это особенно заметно на сайтах, где отдельно индексируются записи, страницы и кастомные типы записей. Оставьте один источник правды.
Сделали свой XML без проверки заголовков
Если XML отдается с text/html или ломается кодировка, поисковик может не принять файл корректно. Всегда проверяйте Content-Type, код ответа и валидность XML.
Безопасность и производительность
С точки зрения производительности встроенный sitemap не самый тяжёлый компонент, но на больших сайтах лишняя генерация всё равно создаёт ненужную работу. Если sitemap собирается динамически, следите за тем, чтобы запросы были лёгкими: используйте fields => 'ids', отключайте лишние расчёты и не тяните метаданные без необходимости.
Если вы храните собственный sitemap в файле, не забывайте обновлять его по расписанию или при публикации контента. Иначе поисковик будет получать устаревшие URL. Для проектов с жёсткой SEO-дисциплиной лучше автоматизировать генерацию, чем править XML вручную.
Если нужна более широкая чистка SEO-дублей и технических хвостов, иногда удобнее закрыть часть задач через специализированный плагин вроде Clearfy Pro, но только если он реально вписывается в вашу схему управления сайтом. В любом случае сначала определите, кто у вас отвечает за sitemap, а уже потом подключайте дополнительные инструменты.
Главная проверка простая: у сайта должен быть один понятный sitemap-источник, он должен открываться с корректным кодом ответа, а в нём должны быть только те URL, которые вы действительно хотите отдавать в индекс.