Как убрать дубли из XML sitemap в WordPress и проверить индексацию

Если в 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 перестали появляться лишние страницы, значит задача решена. Дальше уже имеет смысл смотреть на каноникал, внутренние ссылки и архивы, чтобы убрать дубли не только из карты сайта, но и из всей структуры сайта.

Премиум шаблоны для WordPress Купить плагины для WordPress