Стандартные 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 чаще всего не нужна. Но не стоит отключать всё подряд: сначала убедитесь, что новая карта реально доступна по своему адресу и не закрыта от индексации.
| Вариант | Что делает | Когда подходит | Компромисс |
|---|---|---|---|
| Оставить встроенную sitemap | WordPress сам генерирует /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.
Пошаговое решение без лишнего риска
- Определите, какая sitemap должна остаться основной: ядро WordPress, SEO-плагин или свой endpoint.
- Если используете SEO-плагин, проверьте его настройки sitemap и отключите встроенную карту WordPress через
wp_sitemaps_enabled. - Если нужен собственный XML, создайте отдельный URL и не смешивайте его с системным
/wp-sitemap.xml. - Обновите
robots.txt, чтобы там осталась только одна актуальная ссылка на sitemap. - Проверьте ответ сервера: код
200, корректный XML, отсутствие редиректов и ошибок. - Отправьте в 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-настройкой сайта.