Встроенные XML sitemaps в WordPress удобны, пока сайт не начинает жить по своим правилам: отдельные типы записей, нестандартные архивы, фильтры, закрытые разделы, мультиязычность или уже настроенная генерация карт через SEO-плагин. В таких проектах часто возникает дублирование карт, лишние URL в индексе или конфликт между несколькими источниками sitemap.
Если у вас уже есть карта из Yoast SEO, Rank Math, All in One SEO или кастомная генерация через код, встроенный механизм WordPress обычно лучше отключить. Ниже — как понять, что это действительно нужно, как сделать это без побочных эффектов и чем заменить стандартный вариант.
Когда встроенные XML sitemaps мешают
С 5.5 WordPress сам отдаёт XML-карты сайта. Для простого блога это нормально. Но в реальных проектах проблемы появляются быстро:
- в индексе оказываются URL, которые вы не хотите показывать поисковикам;
- SEO-плагин уже генерирует свою карту, а WordPress добавляет вторую;
- в карте есть посты, страницы или CPT, которые закрыты по логике проекта;
- нужно исключить часть таксономий, медиа или служебных URL;
- карта слишком большая и удобнее разбить её на несколько отдельных файлов.
Диагностика проблемы
Проверьте три вещи:
- Откройте
/wp-sitemap.xml. Если карта доступна, значит встроенный генератор активен. - Посмотрите исходный код главной и шаблонов SEO-плагина: нет ли там ссылок на
wp-sitemap.xmlи отдельные карты плагина. - Проверьте Search Console или Яндекс.Вебмастер: нет ли в отчётах URL из технических разделов, которые попали в карту.
Если у вас уже есть карта от SEO-плагина, две карты одновременно — это не всегда ошибка, но почти всегда лишний шум. Поисковики обычно справляются, однако для поддержки и контроля лучше оставить один источник правды.
Как отключить XML sitemaps в WordPress
Самый надёжный способ — отключить встроенную генерацию через фильтр wp_sitemaps_enabled. Это штатный механизм WordPress, без правки ядра.
add_filter( 'wp_sitemaps_enabled', '__return_false' );Код можно добавить в functions.php дочерней темы, в mu-plugin или в свой небольшой плагин. Для продакшена mu-plugin обычно удобнее: он не зависит от темы и не исчезнет после обновления.
Вариант через mu-plugin
Создайте файл, например wp-content/mu-plugins/disable-wp-sitemaps.php:
<?php
/**
* Plugin Name: Disable WordPress Sitemaps
*/
add_filter( 'wp_sitemaps_enabled', '__return_false' );После этого /wp-sitemap.xml должен отдавать 404 или редирект, если его перехватывает другой плагин или серверная настройка.
Чем заменить стандартную карту сайта
Замену выбирают не по привычке, а по задаче. Если у вас уже стоит SEO-плагин, чаще всего достаточно его sitemap. Если нужен полный контроль, лучше сделать собственную генерацию или отдать карту из отдельного плагина.
| Подход | Когда подходит | Компромисс |
|---|---|---|
| Оставить встроенную карту WordPress | Простой сайт без SEO-плагина и без сложной структуры | Мало гибкости, сложно исключать отдельные типы контента |
| Использовать sitemap SEO-плагина | Есть Yoast SEO, Rank Math или AIOSEO | Нужно следить, чтобы встроенная карта WordPress была отключена |
| Сделать кастомную карту кодом | Нужны точные правила для CPT, таксономий и исключений | Потребуется поддержка и тестирование после обновлений |
Если задача не требует разработки с нуля, не усложняйте. Например, в Clearfy Pro есть инструменты для чистки сайта и управления техническими SEO-элементами, что удобно на проектах, где нужно быстро убрать лишнее без ручной сборки каждого правила: Clearfy Pro.
Кастомная XML-карта для отдельных типов записей
Если нужен свой формат, можно зарегистрировать отдельный sitemap endpoint через rewrite и выводить XML вручную. Для большинства проектов это избыточно, но как пример рабочей логики — полезно.
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;
}
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', 'page' ],
'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;
} );После добавления такого кода не забудьте обновить правила ЧПУ: зайдите в Настройки → Постоянные ссылки и нажмите сохранить. Без этого новый endpoint может не заработать.
Пошаговое решение без лишнего риска
- Определите, какая карта должна остаться: встроенная WordPress, карта SEO-плагина или собственная.
- Отключите встроенный генератор через
wp_sitemaps_enabled. - Проверьте, не создаёт ли карту другой плагин.
- Если нужна своя карта, добавьте отдельный endpoint или используйте возможности SEO-плагина.
- Переотправьте карту в Search Console и Яндекс.Вебмастер.
Если сайт большой, делайте изменения на staging-копии. Для sitemap это особенно важно: ошибка в XML может не сломать фронтенд, но легко испортить индексацию на недели.
Как проверить, что всё сработало
После внедрения проверьте не только сам URL, но и цепочку индексации.
- Откройте
/wp-sitemap.xml— он не должен отдавать рабочую карту WordPress. - Проверьте, что ваша новая карта доступна по нужному адресу и возвращает
200 OK. - Убедитесь, что в XML нет URL из закрытых разделов.
- Посмотрите заголовок ответа:
Content-Type: application/xml. - В Search Console отправьте новую карту и проверьте, нет ли ошибок чтения.
Для быстрой проверки из консоли удобно использовать:
curl -I https://example.com/wp-sitemap.xml
curl -I https://example.com/custom-sitemap.xmlЕсли первый запрос всё ещё отдаёт 200 и XML, значит встроенная карта не отключилась или её перехватывает другой слой — плагин, mu-plugin, кэш или кастомный роутинг.
Частые ошибки и как их исправить
Отключили карту, но в индексе ничего не изменилось
Это нормально: поисковики не удаляют URL мгновенно. Нужно дождаться переобхода и убедиться, что сами страницы правильно закрыты или исключены из sitemap.
Остались две карты сайта
Значит, WordPress отключили, но SEO-плагин продолжает отдавать свою карту. Это не всегда плохо, но если вы хотите один источник, проверьте настройки плагина и отключите лишнее там.
Карта стала 404 после обновления
Частая причина — забыли сбросить правила ЧПУ после добавления собственного endpoint. Если карта сделана через rewrite, сохраните Постоянные ссылки ещё раз.
В XML попали лишние URL
Проблема обычно в том, что выборка строится без фильтрации по post_status, типу записи или таксономиям. Для кастомной генерации всегда проверяйте, какие объекты реально должны индексироваться.
Безопасность и производительность
Не генерируйте тяжёлую карту на каждом запросе без кэша, если сайт большой. Для десятков тысяч URL лучше делать разбиение на несколько файлов и хранить результат отдельно, а не собирать XML на лету из template_redirect.
Если вы пишете собственный генератор, следите за тремя вещами:
- не выводите в карту приватные, черновые и служебные записи;
- не делайте лишние запросы к базе на каждый URL;
- не забывайте обновлять карту после публикации и удаления контента.
Для большинства сайтов практичнее не изобретать свой генератор, а либо оставить встроенный WordPress, либо использовать SEO-плагин с нормальной настройкой исключений. Кастомный код оправдан только тогда, когда структура сайта действительно нестандартная и это нельзя решить настройками.