Дубли в архивах товаров обычно появляются не из-за одной ошибки, а из-за набора мелких настроек: пагинация, сортировки, фильтры, параметры в URL, отдельные страницы тегов и рубрик. В итоге поисковик видит несколько почти одинаковых страниц и тратит краулинговый бюджет не туда, куда нужно. Если сайт на WordPress, это можно разрулить без тяжелых костылей — но сначала стоит понять, где именно рождаются дубли.
Где искать проблему
Сначала проверьте, какие URL реально индексируются. Не ограничивайтесь главной страницей архива: дубли часто сидят в пагинации, в URL с параметрами и в служебных страницах, которые случайно открыты для индексации.
Типичные источники дублей
- страницы архива с пагинацией:
/shop/page/2/,/category/page/3/; - URL с параметрами сортировки и фильтрации:
?orderby=price,?filter_color=red; - архивы тегов и рубрик, которые дублируют основной каталог;
- страницы поиска по сайту;
- страницы автора, если они не несут самостоятельной ценности.
Если у вас нет WooCommerce, логика та же: дубли часто появляются в архиве записей, таксономиях и на страницах с параметрами. Но для каталога товаров проблема обычно заметнее, потому что фильтров и сортировок больше.
Диагностика: как понять, что именно индексируется
Не гадайте по robots.txt. Сначала проверьте фактические URL в поиске и в sitemap. Если в sitemap попадают страницы, которые вы не хотите продвигать, поисковик будет их регулярно обходить.
- Откройте XML sitemap и найдите архивы, теги, страницы поиска и URL с параметрами, если они туда попали.
- Проверьте исходный код страниц архива: есть ли
rel="canonical"и куда он указывает. - Посмотрите, не закрываете ли вы страницу в
robots.txt, но при этом оставляете ее в sitemap — это частая ошибка. - Проверьте заголовок ответа и мета-robots через DevTools или
curl.
curl -I https://example.com/shop/page/2/В ответе вам важны два момента: статус страницы и отсутствие случайных редиректов на нерелевантный URL. Если страница отдает 200 и при этом должна быть исключена из индекса, нужно решать это через canonical и meta robots, а не только через robots.txt.
Что делать: рабочая схема без лишних рисков
Надежный подход обычно состоит из трех частей: убрать из индекса служебные страницы, оставить в sitemap только нужные URL и правильно настроить canonical для пагинации и фильтров.
1. Закрыть от индексации служебные архивы
Если архив автора, поиск по сайту или технические страницы не нужны в выдаче, задайте для них noindex, follow. Это лучше, чем просто запретить обход в robots.txt: поисковик увидит директиву и не будет считать страницу кандидатом в индекс.
add_action('wp_head', function () {
if (is_search() || is_author()) {
echo '<meta name="robots" content="noindex, follow" />' . "\n";
}
}, 1);Такой вариант уместен, если вы не используете SEO-плагин или хотите точечно переопределить поведение. Если SEO-плагин уже управляет robots, не дублируйте логику в теме без необходимости.
2. Настроить canonical для пагинации
Для страниц пагинации canonical должен указывать на саму страницу пагинации, а не на первую страницу архива. Иначе поисковик может склеить все страницы в одну и перестать обходить хвост каталога.
add_filter('wpseo_canonical', function ($canonical) {
if (is_paged()) {
return $canonical;
}
return $canonical;
});Этот пример намеренно простой: если у вас Yoast SEO, canonical обычно и так формируется корректно. Проблема возникает, когда тема или кастомный код подменяет canonical вручную. Тогда нужно убрать самодельную логику и проверить, что canonical на /page/2/ указывает именно на эту страницу.
3. Убрать параметры сортировки и фильтров из индекса
Параметры вроде ?orderby=price или ?filter_color=red почти всегда создают мусорные URL. Их не нужно продвигать как отдельные страницы, если у вас нет четкой стратегии под каждый фильтр.
Если фильтры нужны только пользователю, а не поиску, можно добавить noindex для URL с параметрами:
add_action('wp_head', function () {
if (!empty($_GET)) {
$allowed = array('s');
$keys = array_keys($_GET);
$has_unwanted_params = count(array_diff($keys, $allowed)) > 0;
if ($has_unwanted_params) {
echo '<meta name="robots" content="noindex, follow" />' . "\n";
}
}
}, 1);Это грубая, но рабочая логика. В реальном проекте список допустимых параметров лучше сузить под ваш сайт. Если у вас есть фильтры, которые должны индексироваться, их надо обрабатывать отдельно, а не одним общим правилом.
Сравнение подходов
| Подход | Когда подходит | Минус |
|---|---|---|
| SEO-плагин | Нужна быстрая настройка без кода | Не всегда удобно точечно управлять параметрами |
| Код в теме или mu-plugin | Нужна точная логика для конкретных URL | Требует аккуратной поддержки при обновлениях |
| robots.txt | Нужно ограничить обход технических разделов | Не решает проблему индексации сам по себе |
Если нужен более широкий контроль над дублями, каноникалами и служебными страницами, имеет смысл посмотреть в сторону Clearfy Pro: он закрывает типовые SEO-задачи и чистку сайта без ручного кода. Для проекта с большим количеством архивов это часто практичнее, чем собирать все правила по кускам. Ссылка: Clearfy Pro.
Проверка результата после внедрения
После изменений не ограничивайтесь визуальной проверкой. Нужно убедиться, что поисковик видит именно то, что вы задумали.
- откройте несколько URL с пагинацией и параметрами;
- проверьте наличие
meta robotsи canonical в исходном коде; - убедитесь, что в sitemap нет закрытых страниц;
- посмотрите, не появились ли циклические редиректы;
- проверьте статус в Google Search Console или Яндекс Вебмастере, если сайт там уже добавлен.
Для быстрой проверки можно использовать поиск по исходному коду страницы:
curl -s https://example.com/shop/page/2/ | grep -i -E 'canonical|robots'Если на странице пагинации canonical указывает на первую страницу архива, а вы этого не планировали, значит правило нужно пересмотреть. Если на параметрических URL нет noindex, они продолжат попадать в индекс как отдельные варианты.
Частые ошибки и как их исправить
Закрыли URL в robots.txt, но оставили в sitemap
Это не решает проблему полностью. Поисковик может продолжать знать о странице из sitemap и внешних ссылок. Уберите URL из sitemap и добавьте noindex, если страница должна быть доступна, но не индексироваться.
Склеили все пагинации в canonical на первую страницу
Так делают часто, но для больших каталогов это плохая идея. Пагинация — это отдельные страницы списка, и у них должен быть свой canonical. Иначе хвост каталога может перестать нормально обходиться.
Поставили noindex на все страницы подряд
Иногда в попытке убрать дубли закрывают и полезные страницы каталога. В результате поисковик теряет нормальные посадочные страницы. Сначала разделите URL на полезные и служебные, потом применяйте правила.
Не учли фильтры, которые создают бесконечные комбинации
Если фильтров несколько, количество URL растет быстро. В таком случае лучше ограничить индексацию параметров на уровне логики фильтра, а не пытаться потом вычищать мусор вручную.
Практические советы по безопасности и производительности
Чем больше у вас параметрических URL, тем выше нагрузка на обход и тем больше риск раздувания индекса. Уберите лишние варианты на уровне генерации ссылок: не создавайте ссылки на фильтры, которые не несут ценности, и не плодите пустые комбинации.
Если правите кодом, выносите логику в mu-plugin или отдельный мини-плагин, а не в файл темы. Тогда при смене темы правила не сломаются. И обязательно тестируйте на staging: ошибки в canonical и robots часто незаметны в интерфейсе, но быстро бьют по индексации.
Для сайтов, где дубли появляются не только в архивах, но и в контентных блоках, полезно сначала навести порядок в технических настройках, а уже потом чистить sitemap и шаблоны. Иначе вы будете лечить симптомы, а не причину.