Встроенная XML-карта сайта в WordPress удобна ровно до тех пор, пока не начинает конфликтовать с SEO-настройками, плагином, кастомными типами записей или логикой индексации. Типичный сценарий: у сайта уже есть генератор sitemap в SEO-плагине, а WordPress продолжает отдавать свой /wp-sitemap.xml. В итоге поисковик видит два источника, а вы получаете лишнюю точку контроля и лишний шум в диагностике.
Ниже — рабочий способ отключить стандартную карту сайта WordPress, проверить, что она действительно исчезла, и при необходимости собрать свой вариант без выдуманных хуков и магии.
Когда встроенный sitemap лучше убрать
Отключать стандартную карту сайта имеет смысл не всегда. Но если у вас уже есть Yoast SEO, Rank Math, Clearfy Pro или собственная генерация XML, дублировать карту сайта ядром WordPress обычно не нужно. Особенно это заметно, когда:
- в
robots.txtи в Search Console указаны разные sitemap; - в карте сайта появляются URL, которые вы не хотите отдавать поисковику;
- SEO-плагин строит карту по своей логике, а ядро WordPress добавляет вторую;
- нужно полностью контролировать состав sitemap для кастомных типов записей и таксономий.
Если у вас маленький сайт без SEO-плагина, встроенная карта сайта может быть достаточной. Но как только появляется кастомизация, лучше не смешивать два источника.
Диагностика: что именно сейчас отдаёт WordPress
Сначала проверьте, действительно ли карта сайта генерируется ядром, а не плагином. Откройте в браузере /wp-sitemap.xml. Если страница доступна и отдает XML-индекс, значит стандартный sitemap активен.
Дополнительно посмотрите заголовки ответа и код статуса:
curl -I https://example.com/wp-sitemap.xmlНормальная картина для активной карты сайта — 200 OK. Если вы уже отключали её через плагин или код, но URL всё ещё открывается, значит правило не сработало или его перекрывает другой слой.
Что проверить перед изменениями
- есть ли SEO-плагин, который уже генерирует sitemap;
- не кэшируется ли XML на уровне сервера или CDN;
- не добавлен ли редирект на
/wp-sitemap.xmlв.htaccessили конфиге nginx; - не используется ли MU-плагин, который вмешивается в карту сайта.
Пошаговое решение: отключаем стандартный XML Sitemap
В WordPress 5.5+ встроенная карта сайта подключается через фильтр wp_sitemaps_enabled. Это самый прямой и безопасный способ отключения.
<?php
add_filter( 'wp_sitemaps_enabled', '__return_false' );Код можно добавить в functions.php дочерней темы, в собственный плагин или в MU-плагин. Для продакшена MU-плагин обычно надёжнее: он не зависит от темы и не исчезнет после обновления.
Вариант через мини-плагин
Если не хотите трогать тему, создайте файл, например disable-wp-sitemap.php, и положите его в wp-content/mu-plugins/:
<?php
/**
* Plugin Name: Disable WP Sitemap
*/
add_filter( 'wp_sitemaps_enabled', '__return_false' );После этого стандартный /wp-sitemap.xml должен перестать открываться. Если у вас SEO-плагин со своей картой сайта, его XML останется доступным отдельно.
Если нужен свой sitemap: как сделать без конфликта с ядром
Иногда отключать карту сайта полностью не нужно — достаточно убрать стандартную и оставить собственную генерацию. Это актуально, если вы хотите отдавать только часть контента: например, записи и страницы, но не медиафайлы, не архивы и не нестандартные типы записей.
Ниже пример очень простого XML-эндпоинта через rewrite rule и шаблонный вывод. Это не полноценная замена SEO-плагину, но рабочая база для узкого сценария.
<?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' );
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
$posts = get_posts( [
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => 100,
'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 rules.
Сравнение подходов: плагин, код или SEO-плагин
| Подход | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
Фильтр wp_sitemaps_enabled | Нужно отключить только встроенный sitemap | Минимум кода, без лишней логики | Не решает задачу генерации альтернативной карты |
| SEO-плагин | Уже используется для индексации и canonical | Одна точка управления, обычно есть sitemap index | Нужно следить за настройками и конфликтами модулей |
| Собственный XML-эндпоинт | Нужен узкий контроль над составом URL | Полная кастомизация | Нужно поддерживать код и следить за валидностью XML |
Как проверить, что решение сработало
Проверка должна быть не только визуальной. Смотрите на три вещи: ответ сервера, содержимое XML и отсутствие дублей в источниках карты сайта.
- Откройте
/wp-sitemap.xmlв браузере. - Проверьте через
curl -I, что URL больше не отдаёт активный XML, если вы отключали карту полностью. - Если используете SEO-плагин, убедитесь, что в Search Console указан именно его sitemap, а не старый адрес WordPress.
- Проверьте
robots.txt: там не должно остаться ссылок на неактуальные карты сайта.
Если сайт за CDN или с агрессивным кешем, очистите кеш на уровне плагина, сервера и CDN. Иначе вы можете смотреть на старую версию XML и думать, что фильтр не работает.
Частые ошибки и как их исправить
Код добавили в тему, а после обновления он исчез
Это классическая ошибка. Если отключение sitemap критично для проекта, не держите его в родительской теме. Используйте дочернюю тему или MU-плагин.
Отключили sitemap, но /wp-sitemap.xml всё ещё открывается
Чаще всего виноват кеш или другой плагин, который повторно включает генерацию. Проверьте, нет ли SEO-плагина, который создаёт собственный sitemap и маскирует проблему.
Появился 404 вместо ожидаемого XML
Это нормально, если вы отключали встроенную карту полностью. Но если вы планировали заменить её своим адресом, убедитесь, что rewrite rule добавлен до вывода и что вы сбросили постоянные ссылки.
XML стал невалидным
Обычно причина в лишнем пробеле, BOM в PHP-файле или случайном HTML до XML-заголовка. Для sitemap это критично: один лишний символ ломает весь документ.
Безопасность и производительность: что не стоит упускать
Собственная генерация sitemap должна быть дешёвой по ресурсам. Не вытаскивайте тяжёлые объекты, не делайте лишние мета-запросы и не собирайте XML на каждой странице сайта. Для больших сайтов лучше кешировать готовый XML-файл или хотя бы результат генерации.
Если sitemap строится кодом, проверьте, что он не раскрывает лишние приватные URL. В карту должны попадать только те адреса, которые вы действительно хотите индексировать. Это особенно важно для сайтов с кастомными типами записей, черновыми разделами и служебными страницами.
Для проектов, где нужно не только убрать дубли, но и подчистить технический SEO-слой, удобно смотреть в сторону комплексных решений вроде Clearfy Pro: у него есть инструменты для чистки сайта и отключения лишнего технического мусора. Но даже с плагином полезно понимать, какой именно URL он отключает и что остаётся активным на уровне ядра.
Что делать после внедрения
После отключения или замены sitemap не ограничивайтесь одной проверкой в браузере. Обновите адрес карты сайта в Search Console, проверьте логи обхода и посмотрите, не осталось ли старых ссылок в XML, robots.txt и внутренних настройках SEO-плагина. Если карта сайта была частью миграции или редизайна, сохраните изменения в виде маленького MU-плагина или отдельного сниппета в репозитории проекта — так проще отследить, почему она отключена и кто это сделал.