Встроенная XML-карта сайта в WordPress удобна ровно до тех пор, пока вы не начинаете собирать сайт из нескольких плагинов, кастомных типов записей и отдельных правил индексации. Тогда в sitemap часто попадают лишние URL, дубли архивов, служебные страницы или контент, который вы не хотите отдавать поисковикам. В таких случаях лучше не «чинить» карту точечно, а понять, кто именно её генерирует, и при необходимости отключить стандартную sitemap WordPress, заменив её своей логикой.
Когда встроенная sitemap становится проблемой
С версии 5.5 WordPress сам отдаёт XML sitemap по адресу /wp-sitemap.xml. Для простого сайта этого достаточно, но на практике проблемы появляются в нескольких сценариях:
- в sitemap попадают типы записей, которые вы закрываете от индексации;
- внешний SEO-плагин уже генерирует собственную карту сайта, и у вас получается две точки входа;
- в карте есть таксономии или архивы, которые не должны индексироваться;
- нужно исключить часть контента по бизнес-логике, а не только по общим правилам;
- поисковик видит старую карту, хотя вы уже поменяли структуру сайта.
Если у вас уже есть статья про дубли и параметры URL, это не та же задача. Здесь речь именно о том, как управлять источником sitemap, а не о каноникалах или robots.txt.
Диагностика: кто реально отдаёт sitemap
Перед правками проверьте, откуда именно приходит XML. На одном сайте это может быть встроенный механизм WordPress, на другом — Yoast SEO, Rank Math или кастомный код в теме. Ошибка здесь простая: отключают не тот источник и потом удивляются, что карта сайта осталась доступной.
Что проверить вручную
- Откройте
/wp-sitemap.xmlи посмотрите, есть ли стандартная структура WordPress. - Проверьте карту сайта SEO-плагина: у Yoast это обычно
/sitemap_index.xml, у Rank Math — тоже отдельный индекс. - Посмотрите исходный HTML главной и футера: иногда ссылка на sitemap прописана вручную.
- Если есть кеш-плагин или CDN, очистите кеш перед тестом.
Если в ответе на /wp-sitemap.xml вы видите XML-индекс с разделами posts, pages, categories и т. п., это именно встроенная карта WordPress. Её можно отключить фильтром.
Как отключить XML Sitemap в WordPress кодом
Самый прямой способ — добавить фильтр wp_sitemaps_enabled. Его можно разместить в functions.php дочерней темы, но для стабильности лучше вынести в небольшой mu-plugin или в собственный плагин.
<?php
/**
* Plugin Name: Disable Core XML Sitemap
*/
add_filter( 'wp_sitemaps_enabled', '__return_false' );После этого WordPress перестанет отдавать встроенную sitemap по /wp-sitemap.xml. Это не влияет на sitemap, которую генерирует SEO-плагин, и не ломает обычные страницы сайта.
Если нужно отключить только часть карты
Иногда полное отключение не нужно. Например, вы хотите оставить sitemap для записей и страниц, но убрать авторов, архивы или отдельные таксономии. Тогда лучше работать не с общим выключателем, а с фильтрами WordPress для конкретных типов sitemap.
<?php
add_filter( 'wp_sitemaps_post_types', function( $post_types ) {
unset( $post_types['attachment'] );
return $post_types;
} );
add_filter( 'wp_sitemaps_taxonomies', function( $taxonomies ) {
unset( $taxonomies['post_tag'] );
return $taxonomies;
} );Этот вариант полезен, если вы хотите сохранить встроенный механизм, но сократить его до нужного набора URL. Важно: если SEO-плагин уже генерирует свою карту, правки встроенной sitemap могут вообще не иметь значения для поисковиков. Тогда сначала отключайте дублирующий источник.
Чем заменить встроенную карту сайта
Если вы отключили стандартную sitemap, у вас есть три рабочих пути: оставить генерацию SEO-плагину, собрать собственную карту через код или использовать специализированный плагин. У каждого варианта есть компромисс.
| Вариант | Когда подходит | Минусы |
|---|---|---|
| SEO-плагин | Нужна типовая карта сайта без кастомной логики | Меньше контроля над отдельными URL |
| Свой код | Нужно точно управлять списком страниц | Требует поддержки и тестирования |
| Отдельный плагин | Нужна быстрая настройка без разработки | Лишняя зависимость и возможные конфликты |
Если сайт уже использует SEO-плагин, обычно логичнее оставить генерацию карты там и отключить встроенную sitemap WordPress, чтобы не было двух источников. Если же вам нужна нестандартная логика, например исключать записи по метаполю или по статусу, проще сделать собственный endpoint.
Пример: своя XML-карта сайта для нужных записей
Ниже упрощённый пример, который отдаёт отдельный XML-ответ по адресу /custom-sitemap.xml. Он не пытается заменить весь SEO-плагин, а показывает принцип: вы сами выбираете, какие записи попадут в карту.
<?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;
}
header( 'Content-Type: application/xml; charset=UTF-8' );
$posts = get_posts( array(
'post_type' => array( 'post', 'page' ),
'post_status' => 'publish',
'posts_per_page' => 1000,
'no_found_rows' => true,
) );
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
foreach ( $posts as $post ) {
echo '<url>';
echo '<loc>' . esc_url( get_permalink( $post ) ) . '</loc>';
echo '<lastmod>' . esc_html( get_post_modified_time( 'c', true, $post ) ) . '</lastmod>';
echo '</url>';
}
echo '</urlset>';
exit;
} );После добавления такого кода не забудьте обновить правила ЧПУ: зайдите в Настройки → Постоянные ссылки и просто сохраните форму. Это сбросит rewrite rules без ручного вмешательства в базу.
Пошаговое решение без лишнего риска
- Определите, кто сейчас генерирует sitemap: ядро WordPress, SEO-плагин или кастомный код.
- Если есть два источника, оставьте один. Для большинства сайтов лучше оставить SEO-плагин, а встроенную sitemap отключить.
- Добавьте фильтр
wp_sitemaps_enabledили точечные фильтры для постов и таксономий. - Очистите кеш сайта, сервера и CDN.
- Проверьте, что старый URL возвращает 404 или пустой ответ, а новый sitemap открывается корректно.
- Обновите sitemap в Google Search Console и Яндекс Вебмастере, если адрес изменился.
Как проверить, что всё сработало
Проверка должна быть не визуальной, а технической. Откройте нужные адреса в браузере или через curl и убедитесь, что поведение совпадает с ожидаемым.
curl -I https://example.com/wp-sitemap.xml
curl -I https://example.com/custom-sitemap.xmlЧто считать нормой:
- для отключённой встроенной sitemap —
404или другой ожидаемый ответ, если вы специально переопределили маршрут; - для новой карты —
200 OKи заголовокContent-Type: application/xml; - в XML нет лишних URL, которые вы исключали на этапе генерации;
- в Search Console новая карта добавляется без ошибок загрузки.
Если sitemap открывается, но в ней остались старые ссылки, почти всегда виноват кеш или другой генератор карты, который вы не отключили.
Частые ошибки и как их исправить
Отключили не тот источник
Самая частая ситуация: встроенную sitemap WordPress отключили, а карта сайта всё равно есть, потому что её отдаёт SEO-плагин. Решение простое — проверьте, какой именно URL вы тестируете, и не путайте /wp-sitemap.xml с /sitemap_index.xml.
Добавили код в тему и потеряли его после обновления
Если правка лежит в functions.php родительской темы, она пропадёт после обновления. Для таких задач лучше использовать дочернюю тему или отдельный мини-плагин.
Не обновили rewrite rules
Если вы добавили собственный endpoint, но забыли сбросить правила ЧПУ, URL может отдавать 404. Сохранение настроек постоянных ссылок обычно решает проблему без ручного редактирования конфигурации.
Кеш отдает старый XML
После изменения sitemap обязательно очистите кеш плагина, серверный кеш и CDN. Иначе поисковик и вы будете видеть старую версию, хотя код уже изменён.
Безопасность и производительность
XML sitemap — не тяжёлая функция, но на больших сайтах она может заметно нагружать генерацию, если строится на лету без кеширования. Если у вас десятки тысяч URL, лучше не собирать XML на каждом запросе без необходимости. Для собственного решения имеет смысл кэшировать готовый XML в transient или в файл и обновлять его по событию публикации.
Ещё один практический момент: не отдавайте в sitemap приватные, черновые и служебные записи. Это не только вопрос индексации, но и лишняя утечка структуры сайта. Если логика сложная, проще один раз описать правила в коде, чем потом ловить мусор в индексе.
Если вам нужно не только убрать дубли, но и почистить сайт от лишних технических сущностей, в экосистеме WPShop есть Clearfy Pro, который закрывает часть типовых задач по чистке WordPress и управлению SEO-настройками. Но даже в этом случае полезно понимать, какой именно механизм генерирует sitemap и где он отключается.
Когда лучше не писать свой sitemap
Если сайт обычный: записи, страницы, пара рубрик и один SEO-плагин, собственная карта сайта чаще всего не нужна. В такой конфигурации достаточно отключить встроенную sitemap WordPress, если она дублирует уже существующую, и оставить один источник. Свой XML имеет смысл делать только тогда, когда у вас есть конкретное правило отбора URL, которое нельзя выразить настройками плагина.
Практический ориентир простой: если вы не можете за пять минут объяснить, какие URL должны попадать в sitemap и почему, лучше не усложнять архитектуру. Сначала уберите дублирующий генератор, потом уже добавляйте кастомную логику там, где она действительно нужна.