Если на сайте появились десятки одинаковых URL с параметрами вроде ?sort=price, ?filter_color=red или ?page=2, поисковик начинает индексировать не ту версию страницы. В итоге расходуется краулинговый бюджет, в индексе копятся дубли, а каноническая страница теряет вес.
Такая проблема часто всплывает на каталогах, блогах с сортировкой, страницах тегов и архивах. Решение обычно не одно: часть URL нужно закрыть от индексации, часть — привести к канонической версии, а часть — вообще не генерировать на уровне шаблона.
Как понять, что у вас именно дубли от параметров
Сначала проверьте не «вообще дубли», а конкретно URL с параметрами. Откройте в Search Console отчёт по страницам и посмотрите, есть ли там адреса с query string. Полезно также сделать ручную выборку через site:example.com и поиск по фрагментам параметров.
Типичные признаки:
- одна и та же страница доступна с разными параметрами сортировки;
- фильтры меняют URL, но контент почти не меняется;
- в индексе есть версии с
utm_,gclid,replytocomили внутренними параметрами; - каноникал указывает на одну страницу, но поисковик всё равно держит в индексе варианты.
Что проверить в первую очередь
- какие параметры реально меняют контент, а какие только интерфейс;
- есть ли у страниц с параметрами собственный
rel=canonical; - не создаёт ли тема или плагин отдельные архивы для фильтров;
- не открываются ли служебные параметры через AJAX и одновременно через обычный URL.
Какие URL закрывать, а какие оставлять
Не стоит рубить всё подряд через noindex или запрет в robots.txt. Если параметр меняет смысл страницы и по нему есть спрос, лучше оставить одну индексируемую версию и назначить ей канонический URL. Если параметр служебный, его можно не индексировать и не пускать в sitemap.
| Подход | Когда подходит | Минус |
|---|---|---|
| Canonical | Одинаковый контент с разными URL | Не убирает URL из обхода полностью |
| Noindex | Страница нужна пользователю, но не для поиска | Нужно следить, чтобы страница не блокировалась robots.txt |
| Редирект | Параметр не нужен вообще | Можно сломать фильтры и аналитику |
Пошаговое решение на уровне WordPress
Если параметры создаёт ваша тема или кастомный код, начните с каноникализации. Для служебных параметров можно убрать их из индекса и нормализовать URL. Ниже пример, который удаляет из канонического адреса типовые маркетинговые параметры, но оставляет рабочие параметры фильтрации, если они нужны.
<?php
add_filter('get_canonical_url', function ($canonical, $post) {
if (is_admin() || empty($canonical)) {
return $canonical;
}
$remove = array('utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'gclid', 'fbclid');
$parts = wp_parse_url($canonical);
if (empty($parts['query'])) {
return $canonical;
}
parse_str($parts['query'], $query);
foreach ($remove as $key) {
unset($query[$key]);
}
$new_query = http_build_query($query);
$url = $parts['scheme'] . '://' . $parts['host'];
if (!empty($parts['path'])) {
$url .= $parts['path'];
}
if ($new_query !== '') {
$url .= '?' . $new_query;
}
return $url;
}, 10, 2);Этот код полезен только тогда, когда вы действительно контролируете генерацию канонического URL. Если SEO-плагин уже управляет canonical, лучше не дублировать логику в теме, а настроить исключения в одном месте.
Для страниц, которые не должны индексироваться, но должны открываться пользователю, можно добавить noindex,follow на основе параметров запроса:
<?php
add_filter('wp_robots', function ($robots) {
$blocked = array('replytocom', 'sort', 'filter_color', 'filter_size');
foreach ($blocked as $param) {
if (isset($_GET[$param])) {
$robots['noindex'] = true;
$robots['follow'] = true;
break;
}
}
return $robots;
});Если у вас уже стоит SEO-плагин, проверьте, не конфликтует ли он с этим фильтром. Иногда плагин перезаписывает robots meta, и ваш код просто не срабатывает.
Когда лучше решать проблему на уровне шаблона
Если фильтры строятся в теме, правильнее не плодить URL вообще. Например, сортировку можно оставить через AJAX, а не через GET-параметры. Это особенно полезно для страниц, где сортировка не несёт самостоятельной ценности для поиска.
Практический вариант: оставить один индексируемый URL категории, а фильтрацию и сортировку вынести в интерфейс без изменения адреса. Тогда поисковик видит только основную страницу, а пользователь получает нужный сценарий работы.
Минимальный чек-лист перед правкой
- сохраните список параметров, которые реально используются на сайте;
- проверьте, есть ли эти URL в sitemap;
- посмотрите, не ведут ли на них внутренние ссылки из меню, хлебных крошек или блоков фильтра;
- убедитесь, что для важных страниц есть одна каноническая версия;
- после изменений очистите кеш страниц и кеш SEO-плагина, если он есть.
Проверка результата после внедрения
После правок не ограничивайтесь просмотром исходника. Проверьте три вещи: заголовок, canonical и robots meta. Для URL с параметрами откройте страницу в браузере и посмотрите исходный HTML, либо используйте curl.
curl -I "https://example.com/catalog/?sort=price"
curl -s "https://example.com/catalog/?sort=price" | grep -iE 'canonical|robots'Что должно быть в норме:
- служебные параметры не создают отдельный индексируемый URL;
- каноникал указывает на чистую версию страницы;
- в Search Console постепенно уменьшается число дублей с параметрами;
- внутренние ссылки ведут на основной URL без мусорных query string.
Частые ошибки и как их исправить
Закрыли URL в robots.txt, но он всё равно в индексе
Это типичная ошибка. Если поисковик уже знает URL, запрет в robots.txt не удаляет его из индекса мгновенно. Для таких страниц лучше использовать noindex или каноникал на основную версию, а затем дождаться переобхода.
Поставили noindex на все страницы с параметрами
Так можно случайно выкинуть полезные посадочные страницы, если у вас есть SEO-ценные фильтры. Сначала разделите параметры на служебные и смысловые, потом применяйте правило точечно.
Каноникал ведёт на URL с параметром
Это часто происходит из-за конфликта между темой и SEO-плагином. Проверьте, кто именно генерирует canonical, и оставьте один источник правды. Дублирующая логика в двух местах почти всегда заканчивается нестабильным результатом.
Фильтры работают только через GET и создают слишком много адресов
Если параметров много, а ценности для поиска они не несут, лучше перевести фильтрацию на AJAX или хранить состояние фильтра в интерфейсе без изменения URL. Это уменьшает количество мусорных страниц и упрощает индексацию.
Безопасность и производительность
Любая логика, которая читает параметры из $_GET, должна быть предсказуемой. Не подставляйте параметры в SQL или в HTML без проверки. Для пользовательских значений используйте sanitize_text_field(), а для вывода — esc_url() и esc_html().
Если фильтры тяжёлые, следите за нагрузкой на базу. Большое количество комбинаций параметров может создавать дорогие запросы и лишние обходы ботов. В таких случаях помогает кеширование результатов фильтрации и ограничение числа индексируемых комбинаций.
Для сайтов, где дублей много из-за технических параметров, иногда проще подключить специализированную чистку SEO-артефактов. Например, в Clearfy Pro есть инструменты для удаления дублей и технической оптимизации, но применять их стоит только после проверки, какие URL реально нужны бизнесу.
Главная идея простая: не пытайтесь лечить все дубли одним универсальным правилом. Сначала разделите параметры на полезные и мусорные, потом выберите для каждого сценария свой способ — canonical, noindex или отказ от генерации URL.