Если в XML sitemap попадают дубли страниц, поисковик тратит краулинговый бюджет на мусорные URL, а в отчётах по индексации появляются лишние сигналы. На практике это часто случается после установки SEO-плагина, кастомных типов записей, архивов тегов, пагинации или когда сайт одновременно отдаёт sitemap от темы, плагина и ядра WordPress.
Ниже разберём, как найти источник дублей, что именно отключать, как сделать это кодом без ломания карты сайта и как проверить, что проблема действительно ушла.
Как понять, что в sitemap есть дубли
Сначала не трогайте код. Нужно понять, где именно дублируются URL: в одной и той же карте сайта, между разными sitemap-файлами или между sitemap и реальными страницами, которые вообще не должны индексироваться.
Типичные признаки
- в sitemap одновременно есть
/post-sitemap.xml,/page-sitemap.xmlи отдельные архивы таксономий, которые ведут на одно и то же содержимое; - в карте сайта есть страницы пагинации, служебные URL, вложения медиафайлов или архивы автора, хотя они не нужны для поиска;
- в Search Console растёт число обнаруженных URL, но часть из них не должна индексироваться;
- в sitemap встречаются URL с разными параметрами, ведущие на одинаковую страницу;
- после миграции сайта остались старые sitemap от плагина, который уже удалили.
Что проверить вручную
Откройте sitemap в браузере и посмотрите, кто его генерирует. У WordPress это может быть:
- ядро WordPress:
/wp-sitemap.xml; - SEO-плагин: например, Yoast или Rank Math;
- кастомный код в теме или плагине;
- старый sitemap, который отдаётся через rewrite-правило или статический файл.
Если на сайте больше одного источника sitemap, сначала оставьте только один. Иначе вы будете лечить не дубли, а конфликт генераторов.
Почему дубли появляются именно в WordPress
WordPress сам по себе не создаёт лишние URL без причины. Обычно проблема возникает из-за сочетания настроек темы, SEO-плагина и кастомного кода.
Частые источники дублей
- архивы тегов и категорий, которые дублируют страницы рубрик;
- страницы вложений, если они индексируются отдельно;
- кастомные типы записей, у которых включён архив, но контент уже продублирован в обычных записях;
- пагинация архивов, попавшая в sitemap;
- страницы с параметрами сортировки или фильтрации;
- дубли из-за нескольких SEO-решений одновременно.
Если сайт небольшой, проще всего убрать лишние типы URL на уровне SEO-плагина. Если логика сложнее, лучше управлять sitemap кодом, чтобы не зависеть от настроек, которые могут сбиться после обновления.
Сравнение подходов: плагин, код или настройка сервера
| Подход | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
| SEO-плагин | Нужно быстро отключить архивы, теги, вложения | Без кода, удобно для редактора | Легко забыть о настройке после обновления |
| Код в теме или мини-плагине | Нужен точечный контроль над sitemap | Поведение предсказуемо, можно версионировать | Нужно тестировать после обновлений WordPress и плагинов |
| Серверные правила / статический sitemap | Есть нестандартная генерация URL | Можно полностью исключить лишние файлы | Сложнее поддерживать, выше риск ошибки |
Пошаговое решение: убираем дубли из XML sitemap
Шаг 1. Оставьте один источник sitemap
Если у вас установлен SEO-плагин, проверьте, не включён ли ещё и встроенный sitemap WordPress. Два генератора одновременно почти всегда создают путаницу.
Для проверки откройте:
/wp-sitemap.xml— встроенная карта WordPress;/sitemap_index.xml— часто используется SEO-плагинами;- любые старые адреса вида
/sitemap.xmlили/sitemap-index.xml.
Если один из них отдаёт 200 OK и содержит актуальные URL, а второй тоже живой — нужно отключить лишний источник.
Шаг 2. Исключите ненужные типы контента
Если проблема в архивных страницах, вложениях или служебных типах записей, проще исключить их из sitemap. Ниже пример для встроенного sitemap WordPress через фильтр wp_sitemaps_post_types и wp_sitemaps_taxonomies.
<?php
add_filter( 'wp_sitemaps_post_types', function( $post_types ) {
// Убираем вложения из sitemap
if ( isset( $post_types['attachment'] ) ) {
unset( $post_types['attachment'] );
}
// Пример: скрыть кастомный тип записи, если он дублирует обычные посты
if ( isset( $post_types['news'] ) ) {
unset( $post_types['news'] );
}
return $post_types;
} );
add_filter( 'wp_sitemaps_taxonomies', function( $taxonomies ) {
// Убираем теги, если они не нужны для индексации
if ( isset( $taxonomies['post_tag'] ) ) {
unset( $taxonomies['post_tag'] );
}
return $taxonomies;
} );Этот код лучше разместить в мини-плагине или в functions.php дочерней темы. Не вставляйте его в родительскую тему: после обновления изменения пропадут.
Шаг 3. Уберите пагинацию и служебные страницы из индексации
Если в sitemap попадают страницы пагинации архивов, их обычно не нужно индексировать. Для этого можно не только исключить их из sitemap, но и закрыть от индексации на уровне robots meta или SEO-плагина.
Пример, который добавляет noindex,follow на страницы пагинации архивов:
<?php
add_filter( 'wp_robots', function( $robots ) {
if ( is_paged() ) {
$robots['noindex'] = true;
$robots['follow'] = true;
}
return $robots;
} );Это не удаляет URL из sitemap напрямую, но помогает убрать лишние страницы из индекса и снизить шум в отчётах.
Шаг 4. Если используете SEO-плагин, настройте исключения там
В большинстве случаев удобнее отключить дубли в интерфейсе плагина, а не кодом. Смотрите настройки sitemap для:
- архивов автора;
- архивов тегов;
- медиа-вложений;
- кастомных типов записей;
- таксономий, которые не несут отдельной ценности.
Если плагин позволяет отключить тип контента из sitemap, это нормальный вариант. Но если сайт сложный и настройки часто меняются, код надёжнее.
Диагностика: как понять, что именно дублируется
Перед финальной правкой полезно собрать список URL из sitemap и сравнить его с тем, что реально должно индексироваться. Для этого можно выгрузить sitemap и проверить повторяющиеся шаблоны.
Ниже пример простого скрипта, который можно запустить локально, чтобы посмотреть, какие URL встречаются чаще одного раза в наборе sitemap-файлов:
<?php
$urls = [
'https://example.com/post-1/',
'https://example.com/post-2/',
'https://example.com/post-1/',
'https://example.com/category/news/',
'https://example.com/category/news/',
];
$counts = array_count_values( $urls );
foreach ( $counts as $url => $count ) {
if ( $count > 1 ) {
echo $url . ' => ' . $count . PHP_EOL;
}
}В реальном проекте этот список лучше собирать из XML через SimpleXML или через экспорт из краулера, но даже ручная проверка часто показывает, где именно проблема: в тегах, категориях, вложениях или пагинации.
Проверка результата после внедрения
После правок не ограничивайтесь открытием sitemap в браузере. Нужно убедиться, что поисковик видит именно ту карту, которую вы ожидали.
- Откройте sitemap и проверьте, что лишние URL исчезли.
- Убедитесь, что старый sitemap отдаёт 404, 410 или редирект на актуальный адрес, если он больше не нужен.
- Проверьте заголовок ответа: карта сайта должна отдавать
200 OK. - Сравните количество URL до и после правок.
- В Search Console отправьте sitemap повторно и посмотрите, не появляются ли старые URL снова.
Если используете кэш, очистите его после изменений. Иначе вы можете смотреть на старую версию sitemap и решить, что код не сработал.
Частые ошибки и как их исправить
Оставили два sitemap-генератора
Это самая частая причина. WordPress core, SEO-плагин и кастомный файл могут работать параллельно. Решение простое: оставьте один источник, остальные отключите или перенаправьте.
Удалили URL из sitemap, но не закрыли их от индексации
Если страница больше не нужна, одного удаления из sitemap мало. Проверьте noindex, каноникал и внутренние ссылки. Иначе поисковик всё равно найдёт URL через другие страницы.
Сломали sitemap после обновления темы
Если правки были в functions.php родительской темы, обновление могло их затереть. Перенесите код в мини-плагин или дочернюю тему.
Скрыли важные страницы вместе с мусором
Иногда вместе с тегами и архивами отключают полезные страницы, которые реально приводят трафик. Перед удалением проверьте, не завязаны ли на них внутренние ссылки, хлебные крошки и навигация.
Не обновили кэш и CDN
Если sitemap отдаётся через кэш, изменения могут не примениться сразу. Очистите серверный кэш, плагин кэширования и CDN, если он есть.
Практические советы по безопасности и производительности
Не делайте sitemap слишком «умным». Чем больше логики вы туда добавляете, тем выше риск сломать индексацию после очередного обновления. Для сложных исключений лучше использовать мини-плагин с понятными фильтрами и коротким списком правил.
Если на сайте много кастомных типов записей, проверьте, не генерируется ли sitemap для контента, который закрыт по бизнес-логике, но всё равно доступен по прямой ссылке. Такой контент лучше закрывать системно: через настройки публикации, noindex и внутреннюю архитектуру ссылок.
Для сайтов с большим количеством дублей полезно дополнительно проверить:
- canonical на страницах архивов;
- редиректы со старых URL;
- дубли с параметрами
?amp,?replytocom, сортировкой и фильтрами; - наличие лишних архивов автора и дат.
Если нужен более широкий аудит дублей и технической чистки, в экосистеме WPShop для этого есть Clearfy Pro: он помогает управлять SEO- и техническими настройками без ручного разбрасывания по теме и плагинам. Ссылка: https://wpshop.ru/plugins/clearfy.
Когда лучше не править sitemap кодом
Если сайт ведётся несколькими редакторами, а техническую поддержку никто регулярно не проверяет, жёсткие правки в коде могут создать больше проблем, чем пользы. В таком случае безопаснее начать с настроек SEO-плагина и только потом выносить критичные исключения в код.
Код оправдан, когда:
- нужно исключить конкретный тип записей или таксономию;
- на сайте несколько источников sitemap и нужен жёсткий контроль;
- настройки плагина не покрывают ваш сценарий;
- важно сохранить поведение после обновлений и миграций.
Если после правок sitemap стал короче, но в нём остались только нужные URL, а в Search Console перестали появляться лишние страницы, значит задача решена. Дальше уже имеет смысл смотреть на каноникал, внутренние ссылки и архивы, чтобы убрать дубли не только из карты сайта, но и из всей структуры сайта.