Если в Search Console всплывают дубли, а в индексе оказываются служебные URL, проблема часто не в «плохом SEO», а в том, как WordPress и плагины генерируют robots.txt, sitemap и канонические адреса. На практике это обычно смесь из открытых архивов, лишних таксономий, страниц вложений и дублирующих карт сайта от нескольких плагинов.
Ниже — рабочая схема: сначала находим источник дублей, потом убираем лишнее на уровне настроек и кода, и только после этого проверяем, что поисковик видит именно те URL, которые вы хотите индексировать.
Когда проблема действительно в дублях, а не в «плохой индексации»
Симптомы обычно довольно приземлённые:
- в
site:example.comвидны страницы вложений, теги, архивы автора, которые не нужны в поиске; - в
/robots.txtпоявляются строки, добавленные плагином, но не совпадающие с вашей логикой индексации; - в sitemap есть URL, которые закрыты от индексации или ведут на редирект;
- в Search Console растёт число «Страница с перенаправлением» или «Просканировано, но не проиндексировано»;
- один и тот же контент доступен по нескольким адресам: с
/feed/, с параметрами, через архивы, через attachment-страницы.
Что проверить в первую очередь
Не начинайте с правки robots.txt вручную. Сначала посмотрите, кто его формирует. В WordPress это может быть ядро, SEO-плагин или код темы/му-плагина. То же самое относится к sitemap: если у вас включены два генератора карт сайта, вы получите путаницу почти гарантированно.
- Откройте
/robots.txtи проверьте, нет ли там лишних директив для sitemap или закрытия важных разделов. - Откройте
/wp-sitemap.xmlи sitemap от SEO-плагина, если он установлен. - Сравните, какие URL реально отдаются с кодом 200, а какие редиректятся.
- Проверьте, не индексируются ли страницы вложений и архивы медиа.
Пошаговое решение: убираем дубли без поломки сайта
1. Оставьте один источник sitemap
В WordPress есть встроенный XML sitemap, но многие сайты используют SEO-плагин, который генерирует собственную карту сайта. Если включены оба варианта, поисковик может получать два набора URL с разной логикой.
Решение простое: оставьте один источник. Если вы используете SEO-плагин с полноценной настройкой sitemap, встроенный sitemap ядра обычно отключают через фильтр.
<?php
// Отключаем встроенный sitemap WordPress, если sitemap уже генерирует SEO-плагин.
add_filter( 'wp_sitemaps_enabled', '__return_false' );
Этот код лучше добавить в небольшой must-use плагин или в отдельный функциональный плагин, а не в functions.php темы, если тема может меняться.
2. Закройте от индексации служебные архивы и вложения
Частая причина дублей — страницы вложений. Они создаются автоматически, но почти никогда не несут самостоятельной ценности для поиска. Если на сайте нет осознанной стратегии для attachment-страниц, их лучше редиректить на сам файл или на родительскую запись.
<?php
// Редирект attachment-страниц на родительскую запись или главную.
add_action( 'template_redirect', function () {
if ( is_attachment() ) {
$parent = wp_get_post_parent_id( get_queried_object_id() );
if ( $parent ) {
wp_safe_redirect( get_permalink( $parent ), 301 );
exit;
}
wp_safe_redirect( home_url( '/' ), 301 );
exit;
}
} );
Если у вас SEO-плагин умеет закрывать архивы автора, даты, теги и медиа-страницы, используйте его настройки. Код нужен только там, где плагин не закрывает конкретный сценарий или вы хотите более жёсткую логику.
3. Приведите robots.txt к одной логике
Самая частая ошибка — вручную добавлять в robots.txt всё подряд, не понимая, что файл не убирает уже проиндексированные URL. Он только управляет обходом. Если страница уже в индексе, одного Disallow мало: нужен noindex, редирект или удаление дубля.
Если нужно добавить свои правила, делайте это через фильтр robots_txt, а не редактированием физического файла на сервере, если WordPress его генерирует динамически.
<?php
add_filter( 'robots_txt', function ( $output, $public ) {
$output .= "\nUser-agent: *\n";
$output .= "Disallow: /wp-json/\n";
$output .= "Disallow: /?s=\n";
$output .= "Sitemap: " . home_url( '/sitemap_index.xml' ) . "\n";
return $output;
}, 10, 2 );
Здесь важно не переборщить. Например, закрывать /wp-json/ имеет смысл не всегда: если сайт использует REST API для фронтенда, такая блокировка может мешать работе. Сначала проверьте, нужен ли этот путь на сайте.
4. Уберите дубли из таксономий и архивов
Если у вас много тегов с одной-двумя записями, архивы тегов часто становятся тонкими дублями. Аналогично работают архивы автора на небольших сайтах, где один автор и весь контент повторяет структуру главной.
Практический подход такой:
- оставить индексируемыми только те таксономии, которые реально дают уникальную навигацию;
- закрыть пустые и слабые архивы через SEO-плагин или код;
- не плодить одинаковые описания рубрик и тегов;
- проверить, не создаёт ли тема дополнительные архивные шаблоны с одинаковым контентом.
Сравнение подходов: плагин, код или ручная правка
| Подход | Когда подходит | Минус |
|---|---|---|
| SEO-плагин | Нужно быстро закрыть архивы, настроить sitemap и canonical без разработки | Часть логики зависит от интерфейса и может быть скрыта в настройках |
| Код | Нужна точечная логика для attachment, robots.txt или нестандартных архивов | Требует контроля при обновлениях и аккуратного тестирования |
| Ручная правка файлов | Редкий случай, когда WordPress не генерирует robots.txt динамически | Легко потерять изменения при миграции или конфликте с плагином |
Если нужен более широкий набор инструментов для чистки дублей, служебных страниц и SEO-логики, на практике часто используют Clearfy Pro: он закрывает типовые технические проблемы без того, чтобы писать всё руками. Но даже в этом случае полезно понимать, что именно он меняет, иначе легко спрятать симптом, а не причину.
Как проверить, что решение сработало
После правок не ограничивайтесь открытием главной страницы. Проверьте несколько уровней сразу:
/robots.txtдолжен отдавать нужные директивы и только один блок sitemap;/wp-sitemap.xmlили sitemap SEO-плагина должен содержать только индексируемые URL;- страницы вложений должны редиректить, а не отдавать 200;
- архивы, которые вы закрыли, должны иметь корректный
noindexили исчезнуть из sitemap; - в Search Console после переобхода не должно появляться новых дублей по тем же шаблонам.
Проверка в браузере — это только первый шаг. Полезно ещё посмотреть исходный код страниц и убедиться, что на проблемных URL стоит канонический адрес, а не сам дубль.
Быстрая ручная проверка
# Проверить robots.txt
curl -I https://example.com/robots.txt
# Проверить, не отдает ли attachment-страница 200
curl -I https://example.com/sample-attachment/
# Проверить sitemap
curl -I https://example.com/sitemap_index.xml
Если сервер отвечает редиректом, смотрите цепочку целиком. Иногда формально всё работает, но URL проходит через два-три промежуточных шага, и это уже лишняя нагрузка и лишний шум для индексации.
Частые ошибки и как их исправить
Закрыли URL в robots.txt, но он всё равно в индексе
Это нормальная ситуация. Disallow не удаляет уже известный поисковику URL. Если страница должна исчезнуть, используйте noindex, 301-редирект или отдачу 410 в зависимости от сценария.
Отключили встроенный sitemap, но забыли про плагин
В результате sitemap исчезает полностью или, наоборот, остаётся второй источник карт сайта. Проверьте, какой именно URL вы отдаёте в robots.txt и какой sitemap реально открывается в браузере.
Редирект attachment-страниц ломает медиа
Такое бывает, если тема или плагин рассчитывают на отдельную страницу вложения. Перед массовым редиректом проверьте, не используется ли attachment-страница в шаблонах, галереях или внешних ссылках.
Закрыли слишком много архивов
Если убрать из индекса все таксономии подряд, можно потерять полезные посадочные страницы. Оставляйте индексируемыми только те архивы, которые реально помогают навигации и имеют уникальный контент.
Что делать, если дубль создаёт не WordPress, а сервер или CDN
Иногда проблема не в CMS. Один и тот же URL может открываться с www и без www, с http и https, со слешем и без слеша, а CDN ещё и кэширует старую версию robots.txt. Тогда сначала приводят к одному каноническому варианту домена, потом чистят кэш, и только после этого проверяют sitemap и индексацию.
Если у вас подключён кэш-плагин или CDN, после изменений обязательно сбросьте:
- кэш страницы;
- объектный кэш, если он используется;
- кэш CDN;
- кэш браузера при локальной проверке.
Иначе вы будете смотреть на старый robots.txt и делать неверные выводы.
Практика безопасности и производительности
Чем меньше лишних архивов и служебных URL открыто для обхода, тем меньше мусора получает поисковик и тем меньше бесполезных запросов делает бот. Это не магическая оптимизация, но на больших сайтах она заметно упрощает поддержку.
Не храните критичную логику только в теме. Если вы правите robots_txt, редиректы и sitemap через код, лучше вынести это в отдельный мини-плагин или mu-plugin. Тогда смена темы не сломает индексацию.
И ещё один практический момент: не отключайте всё подряд «для SEO». Если сайт использует REST API, AJAX или нестандартные шаблоны, сначала проверьте зависимость, потом закрывайте путь. В WordPress слишком много технических URL, которые выглядят как мусор, но на деле нужны фронтенду или админке.