После смены структуры URL в WordPress чаще всего ломается не сам сайт, а его карта сайта. В sitemap начинают попадать старые архивы, дубли записей, страницы вложений, служебные URL или одинаковые материалы под разными адресами. Для поисковика это не «мелкая косметика», а лишние сигналы: часть страниц индексируется не там, где нужно, а часть — вообще дублирует основной контент.
Ниже разберём, как понять, что проблема именно в sitemap, какие URL обычно лишние, и как убрать их без поломки индексации. Примеры ниже рассчитаны на стандартный WordPress и на ситуации, когда sitemap генерирует сам WordPress или SEO-плагин.
Когда проблема действительно в sitemap, а не в индексации
Сначала стоит проверить, что вы боретесь с причиной, а не с симптомом. Если в поиске есть дубли, но в XML sitemap они не попадают, значит источник проблемы другой: внутренние ссылки, каноникал, пагинация, редиректы или старые внешние URL. Если же лишние адреса уже лежат в sitemap, поисковик получает прямую подсказку, что их можно обходить и индексировать.
Что обычно попадает в карту сайта лишним
- старые URL после смены структуры постоянных ссылок;
- архивы авторов и дат, если они не нужны для поиска;
- страницы вложений медиафайлов;
- пустые или технические таксономии;
- дубли записей через несколько архивов;
- страницы пагинации, если они не должны индексироваться;
- черновые или скрытые типы записей, которые случайно остались включены в sitemap.
Как быстро диагностировать источник
- Откройте sitemap в браузере и посмотрите, какие именно URL повторяются или выглядят лишними.
- Сравните адреса в sitemap с текущими постоянными ссылками в админке WordPress.
- Проверьте, кто генерирует sitemap: ядро WordPress или SEO-плагин.
- Если после миграции остались старые URL, проверьте редиректы и канонические адреса.
Если sitemap формируется ядром WordPress, его можно точечно фильтровать через встроенные хуки. Если карту сайта отдаёт SEO-плагин, логика будет другой: нужно отключать конкретные типы контента или таксономии в настройках плагина либо через его фильтры.
Пошаговое решение для стандартного XML sitemap WordPress
Начиная с WordPress 5.5, у ядра есть собственный XML sitemap. Это удобно, но после изменения структуры сайта он может продолжать отдавать лишние типы контента, если вы не ограничили их явно. Самый безопасный путь — не отключать sitemap целиком, а убрать только ненужные сущности.
Шаг 1. Скрыть ненужные типы записей из sitemap
Если у вас есть кастомные типы записей, которые не должны индексироваться, их лучше исключить на уровне генерации карты сайта. Для этого подходит фильтр wp_sitemaps_post_types.
<?php
add_filter( 'wp_sitemaps_post_types', function( $post_types ) {
// Убираем служебный тип записи из sitemap.
unset( $post_types['landing'] );
// Если нужно, можно скрыть и стандартные типы.
// unset( $post_types['attachment'] );
return $post_types;
} );Этот вариант лучше, чем пытаться закрывать URL только через robots.txt. Robots.txt не убирает адрес из sitemap и не мешает поисковику видеть его как потенциально важный.
Шаг 2. Исключить отдельные записи по ID
Если проблема не в типе контента, а в нескольких конкретных страницах, используйте фильтр wp_sitemaps_posts_query_args. Он позволяет убрать записи из выборки до генерации sitemap.
<?php
add_filter( 'wp_sitemaps_posts_query_args', function( $args, $post_type ) {
if ( 'post' === $post_type ) {
$args['post__not_in'] = array( 123, 456 );
}
return $args;
}, 10, 2 );Такой подход полезен, если старые материалы остались в базе, но уже не должны участвовать в индексации. Например, это может быть дубль статьи после переноса с другого домена или тестовая публикация, которую забыли удалить.
Шаг 3. Убрать ненужные таксономии
Для архивов категорий, тегов и пользовательских таксономий используйте фильтр wp_sitemaps_taxonomies. Это особенно важно, если после редизайна у вас появились пустые или дублирующие архивы.
<?php
add_filter( 'wp_sitemaps_taxonomies', function( $taxonomies ) {
unset( $taxonomies['post_tag'] );
unset( $taxonomies['product_cat'] );
return $taxonomies;
} );Не стоит отключать таксономии «на глаз». Если архивы реально дают трафик и содержат уникальные материалы, лучше оставить их в sitemap и управлять индексацией отдельно.
Если sitemap генерирует SEO-плагин
У популярных SEO-плагинов логика обычно проще: лишние URL убираются в настройках типа контента, таксономии или архивов. Это предпочтительнее, чем править код, если сайт ведётся редактором без доступа к теме.
| Подход | Когда подходит | Плюс | Минус |
|---|---|---|---|
| Настройки плагина | Нужно быстро убрать типы контента или архивы | Безопасно для обновлений | Не всегда хватает точности |
| Код через фильтры | Нужны точечные исключения | Гибко и прозрачно | Требует контроля при обновлении темы |
| robots.txt | Нужно закрыть обход, но не сам URL | Просто внедрить | Не решает проблему дублирования в sitemap |
Если вы используете плагин уровня Clearfy Pro, там удобно отключать лишние архивы, страницы вложений и другие технические URL без правки шаблонов. Для сайтов с большим количеством дублей это часто быстрее, чем собирать набор фильтров вручную. Подробности по продукту можно посмотреть здесь: https://wpshop.ru/plugins/clearfy.
Проверка результата после внедрения
После правок не ограничивайтесь открытием sitemap в браузере. Нужно проверить, что карта сайта обновилась и что поисковик видит именно ту структуру, которую вы задумали.
Что проверить вручную
- в sitemap больше нет старых URL;
- в списке не осталось вложений, если вы их отключали;
- архивы авторов, дат и тегов не попадают в карту сайта, если они не нужны;
- новые важные страницы присутствуют;
- URL открываются с кодом 200 и без лишних редиректов;
- в sitemap нет страниц, которые закрыты от индексации через
noindex.
Что проверить через инструменты
Если сайт уже добавлен в Google Search Console, отправьте sitemap на повторную обработку и посмотрите отчёт по страницам. Важно не только отсутствие ошибок, но и то, что количество обнаруженных URL соответствует реальной структуре сайта. Для небольших сайтов это можно проверить вручную, для крупных — сравнить выборочно несколько разделов.
Дополнительно полезно открыть исходный XML и убедиться, что в нём нет адресов, которые вы убрали из настроек. Если URL всё ещё присутствует, значит фильтр не сработал, кэш не сброшен или sitemap генерирует не ядро WordPress, а другой плагин.
Частые ошибки и как их исправить
Отключили URL в robots.txt, но не убрали из sitemap
Это самая частая ошибка. Поисковик всё равно видит адрес в карте сайта и получает сигнал, что страница существует. Если цель — убрать дубль из индексации, сначала исключайте его из sitemap, потом уже решайте вопрос с обходом.
Скрыли страницу через noindex, но оставили в карте сайта
Так можно делать только осознанно, когда страница ещё нужна пользователю, но не должна индексироваться. Если же это старый дубль, лучше убрать его из sitemap полностью. Иначе вы создаёте лишний шум в отчётах и затягиваете переобход.
Правили functions.php, а потом потеряли изменения после обновления темы
Если код нужен надолго, лучше вынести его в мини-плагин или в mu-plugin. Это особенно важно для фильтров sitemap: они должны жить отдельно от визуальной части темы.
Не очистили кэш после изменений
Если на сайте стоит кэш страницы или объектный кэш, sitemap может продолжать отдавать старую версию. После правок очистите кэш плагина, серверный кэш и, если используется CDN, его тоже.
Практический вариант для мини-плагина
Если вы не хотите держать код в теме, проще создать небольшой плагин. Это удобнее для поддержки и безопаснее при смене шаблона.
<?php
/**
* Plugin Name: Sitemap Cleanup for WordPress
*/
add_filter( 'wp_sitemaps_post_types', function( $post_types ) {
unset( $post_types['attachment'] );
unset( $post_types['landing'] );
return $post_types;
} );
add_filter( 'wp_sitemaps_taxonomies', function( $taxonomies ) {
unset( $taxonomies['post_tag'] );
return $taxonomies;
} );Такой файл можно положить в отдельную папку в wp-content/plugins/ и активировать как обычный плагин. Для точечных правок этого достаточно, а при необходимости код легко расширить.
Что делать, если дубли появились после миграции
После переноса сайта часто остаются старые адреса, а новая структура уже живёт отдельно. В этом случае одной правки sitemap мало: нужно синхронизировать редиректы, канонические URL и карту сайта. Сначала уберите старые адреса из sitemap, затем проверьте 301-редиректы со старых URL на новые, и только потом отправляйте карту на переобход.
Если старый и новый адрес существуют одновременно, поисковик может долго выбирать между ними. В такой ситуации sitemap должен показывать только канонический вариант. Всё остальное лучше убрать из генерации, а не надеяться, что робот сам догадается.
Короткий чек-лист перед публикацией изменений
- определён источник sitemap: ядро WordPress или SEO-плагин;
- убраны лишние типы записей и таксономии;
- исключены конкретные старые URL, если они остались в базе;
- очищен кэш сайта и CDN;
- проверен XML sitemap в браузере;
- отправлен обновлённый sitemap в Search Console;
- проверены редиректы со старых адресов на новые.
Если задача не сводится к одному-двум URL, а проблема системная, лучше сначала навести порядок в структуре контента, а уже потом тонко настраивать sitemap. Иначе вы будете постоянно чинить следствие, а не источник дублей.