Страницы с параметрами в URL — типичная причина мусора в индексе: ?sort=price, ?filter_color=red, ?utm_source=..., внутренние фильтры каталога, пагинация с параметрами и служебные комбинации, которые не несут самостоятельной ценности. Проблема не в самих параметрах, а в том, что поисковик начинает считать такие URL отдельными страницами и тратит на них обход, а иногда ещё и показывает их вместо основной версии.
Ниже — рабочая схема для WordPress: как диагностировать проблему, какие URL закрывать, чем отличаются noindex, canonical и редиректы, и как проверить, что всё сработало без побочных эффектов.
Когда параметры уже расползлись по индексу
Сначала стоит понять, что именно у вас индексируется. Не все URL с параметрами нужно закрывать одинаково. Например, UTM-метки обычно не должны попадать в индекс, но и не требуют отдельной страницы. А вот фильтры каталога, сортировки и поисковые параметры могут создавать десятки или сотни дублей одной и той же сущности.
Что искать в Google Search Console и логах
Откройте отчёт по страницам и посмотрите, есть ли там URL с вопросительным знаком. Дополнительно проверьте:
- страницы с параметрами в отчёте «Страницы»;
- дубли одной и той же категории с разными сортировками;
- URL, которые открываются, но не должны иметь отдельный сниппет;
- страницы, где canonical указывает не туда или отсутствует вовсе.
Если у вас есть доступ к логам веб-сервера, полезно посмотреть, как часто поисковые боты ходят на такие адреса. Это помогает понять, есть ли реальная нагрузка на обход.
Какие URL закрывать, а какие оставить
Самая частая ошибка — закрывать всё подряд. Это ломает фильтры, сортировки и иногда даже полезные посадочные страницы. Рабочий подход такой: закрываем только те параметры, которые не создают самостоятельной ценности и не должны ранжироваться как отдельные документы.
| Подход | Когда использовать | Плюсы | Минусы |
|---|---|---|---|
| canonical | Страница должна открываться пользователю, но в индексе нужна основная версия | Не ломает UX, мягко склеивает дубли | Не всегда достаточно, если URL активно индексируется |
noindex,follow | Страница не должна быть в поиске, но ссылки с неё можно обходить | Прямой сигнал поисковику | Нужно аккуратно внедрять, чтобы не закрыть важные страницы |
| 301-редирект | Параметр бесполезен и не нужен пользователю | Убирает дубль полностью | Нельзя применять к страницам, которые реально используются |
Пошаговое решение: от мягкой склейки до жёсткого запрета
Если задача касается именно WordPress, удобнее разделить решение на два слоя: на уровне шаблона/плагина и на уровне сервера. Так проще не сломать нужные страницы и быстрее проверить результат.
Шаг 1. Добавьте canonical на основную версию страницы
Если у вас есть страницы с сортировкой или фильтром, но контент по сути тот же, canonical должен указывать на чистый URL без параметров. В WordPress это можно сделать через фильтр wpseo_canonical, если используется Yoast SEO, или через собственный вывод в <head>, если вы контролируете тему.
Пример для темы или мини-плагина:
<?php
add_action('wp_head', function () {
if (is_admin()) {
return;
}
if (!empty($_GET)) {
$canonical = home_url(add_query_arg([], $GLOBALS['wp']->request));
$canonical = strtok($canonical, '?');
echo '<link rel="canonical" href="' . esc_url($canonical) . '" />' . "\n";
}
}, 1);Этот пример не универсален для всех сайтов, но показывает принцип: canonical должен вести на чистую версию без служебных параметров. Если у вас уже есть SEO-плагин, не дублируйте canonical из двух мест одновременно.
Шаг 2. Для служебных параметров добавьте noindex
Когда страница не должна попадать в поиск вообще, лучше отдать поисковику явный сигнал через meta robots. Это особенно полезно для страниц сортировки, внутренних фильтров, сравнения, временных параметров и технических комбинаций.
<?php
add_action('wp_head', function () {
if (is_admin()) {
return;
}
$blocked_params = ['sort', 'orderby', 'filter_color', 'filter_size', 'price_min', 'price_max'];
foreach ($blocked_params as $param) {
if (isset($_GET[$param])) {
echo '<meta name="robots" content="noindex,follow" />' . "\n";
break;
}
}
}, 5);Здесь важно не ставить noindex на все URL с параметрами без разбора. Например, если у вас есть посадочная страница с параметром, который реально нужен для бизнеса, её лучше оставить с canonical и отдельной логикой.
Шаг 3. Уберите мусорные параметры на уровне сервера
Если параметр вообще не нужен и не должен существовать как отдельный URL, проще сделать редирект на чистую страницу. Это особенно полезно для UTM-меток, старых параметров после миграции и технических хвостов, которые появляются из рекламы или внешних ссылок.
Для Apache можно использовать mod_rewrite в .htaccess:
RewriteEngine On
# Убираем UTM и другие маркетинговые параметры
RewriteCond %{QUERY_STRING} (^|&)(utm_source|utm_medium|utm_campaign|utm_term|utm_content)=[^&]+ [NC]
RewriteRule ^ %{REQUEST_URI}? [R=301,L]Если сайт на Nginx, логику лучше вынести в конфигурацию сервера или в PHP-редирект, если доступ к конфигу ограничен. Главное — не делать цепочки редиректов и не редиректить то, что должно работать для пользователя.
Если фильтры нужны пользователю, но не нужны поиску
Это самый частый сценарий для каталогов, архивов и подборок. Пользователь должен уметь отфильтровать контент, а поисковик — не индексировать каждую комбинацию. Здесь обычно работает связка: чистый canonical, noindex,follow для комбинаций и запрет на генерацию лишних ссылок в шаблоне.
Проверьте шаблон ссылок фильтра
Если фильтр генерирует ссылки вида ?filter_color=red&filter_size=m на каждой странице, поисковик будет их обходить. Иногда достаточно убрать такие ссылки из HTML и оставить их только в JS-обработке формы. Это снижает количество мусорных URL, которые бот видит как отдельные документы.
Для форм фильтрации полезно:
- не добавлять UTM и служебные параметры в внутренние ссылки;
- не дублировать один и тот же фильтр в нескольких форматах URL;
- не генерировать индексируемые страницы для пустых или почти пустых комбинаций;
- оставлять canonical на основную категорию, если фильтр не создаёт полноценную посадочную страницу.
Как проверить, что решение сработало
Проверка должна быть не только визуальной. Откройте несколько URL с параметрами и убедитесь, что поведение соответствует выбранной стратегии.
- Посмотрите исходный код страницы и найдите
meta name="robots"иlink rel="canonical". - Проверьте, что canonical указывает на чистый URL без лишних параметров.
- Убедитесь, что служебные URL не отдают 200 там, где нужен редирект.
- В Google Search Console используйте проверку URL и посмотрите, как Google видит страницу.
- Через несколько дней проверьте отчёт по индексированию: мусорные URL должны исчезать или переставать накапливаться.
Если вы закрывали URL через noindex, не ждите мгновенного эффекта. Поисковику нужно заново обойти страницу и увидеть обновлённый сигнал.
Частые ошибки и как их исправить
Canonical указывает на саму себя вместе с параметрами
Это происходит, когда canonical собирается из текущего URL без очистки query string. В итоге страница с ?sort=price канонизируется сама на себя, и дубль не склеивается. Исправление простое: canonical должен строиться от базового пути без параметров.
noindex ставят на все страницы с вопросительным знаком
Так можно случайно закрыть полезные посадочные страницы, страницы акций или фильтры, которые реально нужны пользователям. Перед внедрением составьте список параметров и разделите их на служебные и рабочие.
Редиректят всё на главную
Это плохая практика. Если параметр не нужен, редирект должен вести на соответствующую чистую страницу, а не на главную. Иначе вы теряете релевантность и создаёте цепочки ошибок 404/soft 404.
Оставляют одновременно canonical, noindex и редирект
Эти сигналы могут конфликтовать. Если страница редиректится, canonical и meta robots на ней уже не имеют смысла. Сначала выберите один механизм, потом проверяйте его отдельно.
Практические советы по безопасности и производительности
Чем больше параметров вы обрабатываете, тем выше риск ошибок в шаблоне и лишней нагрузки. Не собирайте canonical вручную через небезопасные строки и не выводите в head сырые значения из $_GET без экранирования.
- используйте
esc_url()иsanitize_text_field()для параметров; - не храните список запрещённых параметров в нескольких местах;
- если логика сложная, вынесите её в маленький mu-plugin, а не в functions.php;
- после изменений очистите кеш страницы и кеш CDN, иначе поисковик и пользователи увидят старую версию;
- если используете SEO-плагин, проверьте, не дублирует ли он ваши мета-теги.
Если нужен более широкий контроль над дублями, canonical и технической чисткой сайта, в экосистеме WPShop есть Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но даже с плагином полезно понимать, какие именно параметры вы закрываете и почему.
Мини-чек-лист перед публикацией
- Список параметров разделён на служебные и полезные.
- Для полезных страниц настроен canonical на чистый URL.
- Для мусорных комбинаций стоит
noindex,followили редирект. - Нет конфликтов между SEO-плагином, темой и кастомным кодом.
- Проверка URL в Search Console показывает ожидаемую версию страницы.
- Кеш очищен, а старые URL не отдаются из CDN.
Если после внедрения в индексе всё ещё остаются старые адреса, это обычно не ошибка кода, а вопрос времени и повторного обхода. В такой ситуации полезно не расширять запреты, а сначала проверить, какие именно URL продолжают появляться и по какой причине они вообще доступны.