На WordPress часто всплывает одна и та же проблема: сайт уже нормально работает, но в индекс начинают попадать страницы с фильтрами, сортировкой, пагинацией поиска и служебными параметрами. В итоге в выдаче появляются дубли, а поисковику приходится тратить краулинговый бюджет на мусорные URL.
Решение зависит от того, как именно у вас устроены фильтры: это может быть обычный GET-параметр, AJAX-фильтрация с обновлением URL, отдельные архивы таксономий или страницы поиска. Ниже — рабочий сценарий, который помогает закрыть технические страницы от индексации и не задеть полезные посадочные.
Когда проблема уже есть: что проверить в первую очередь
Сначала не трогайте код. Посмотрите, какие именно URL попали в индекс и почему. Если в поиске уже есть страницы вида ?sort=price, ?filter_color=blue, ?orderby=popularity или похожие варианты, это почти всегда следствие того, что фильтры генерируют отдельные адреса без явного запрета на индексацию.
Признаки, что индексация пошла не туда
- в Search Console есть страницы с параметрами, которые не должны ранжироваться;
- в логах обхода много однотипных URL с разными значениями фильтров;
- в выдаче видны страницы сортировки, а не базовая категория;
- каноникал у параметрических страниц указывает на саму себя или отсутствует;
- robots.txt не помогает, потому что URL уже известны поисковику и могут оставаться в индексе.
Если фильтр работает через AJAX, это не значит, что проблем нет. Часто скрипт меняет адрес через history.pushState, и поисковик видит уже полноценную страницу с параметрами.
Какой подход выбрать: код, плагин или настройка темы
Если у вас один-два параметра, проще закрыть их кодом. Если параметров много и они меняются в админке, удобнее использовать SEO-плагин или инструмент для технической чистки сайта. Но важно понимать компромисс: плагин быстрее в настройке, код точнее и легче контролируется.
| Подход | Когда подходит | Минус |
|---|---|---|
| Код в теме или мини-плагине | Нужно закрыть конкретные параметры и сохранить контроль | Надо следить за обновлениями и тестировать вручную |
| SEO-плагин | Нужны noindex, canonical и правила для разных типов страниц | Не всегда удобно для точечных исключений |
| robots.txt | Нужно ограничить обход, а не индексацию уже известных URL | Не решает проблему полностью |
Если нужен более широкий набор инструментов для чистки дублей и технической оптимизации, в экосистеме WPShop для этого есть Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но даже с плагином полезно понимать, что именно вы закрываете и почему.
Пошаговое решение через wp_robots и canonical
Самый безопасный вариант — не ломать сайт целиком, а точечно добавлять noindex, follow для страниц с параметрами сортировки и фильтрации. Для этого удобно использовать фильтр wp_robots, который есть в современных версиях WordPress.
<?php
add_filter( 'wp_robots', function( $robots ) {
if ( is_admin() ) {
return $robots;
}
$query_args = array( 'sort', 'orderby', 'filter_color', 'filter_size', 'price_min', 'price_max' );
foreach ( $query_args as $arg ) {
if ( isset( $_GET[ $arg ] ) ) {
$robots['noindex'] = true;
$robots['follow'] = true;
break;
}
}
return $robots;
} );Этот код не запрещает обход страниц, но говорит поисковику не индексировать такие URL. Для большинства фильтров этого достаточно. Если у вас есть страницы, которые должны индексироваться как посадочные, не добавляйте их в список параметров.
Дальше стоит привести canonical к базовой версии страницы. Это особенно важно, если фильтр меняет только сортировку или порядок вывода, а контент по сути тот же.
<?php
add_filter( 'get_canonical_url', function( $canonical ) {
if ( is_admin() ) {
return $canonical;
}
$blocked_args = array( 'sort', 'orderby', 'filter_color', 'filter_size', 'price_min', 'price_max' );
foreach ( $blocked_args as $arg ) {
if ( isset( $_GET[ $arg ] ) ) {
return remove_query_arg( $blocked_args, home_url( add_query_arg( array(), $_SERVER['REQUEST_URI'] ) ) );
}
}
return $canonical;
} );Здесь важно не переусердствовать. Canonical должен вести на реальную основную страницу категории, а не на случайно собранный URL из REQUEST_URI. Если структура сложная, лучше собирать canonical явно через логику шаблона или SEO-плагин.
Если фильтры работают через AJAX
AJAX-фильтрация часто создаёт ложное ощущение, что индексации не будет. На практике всё зависит от того, обновляется ли URL в адресной строке. Если да, поисковик может увидеть отдельные комбинации фильтров. Если нет, проблема обычно меньше, но остаются дубли в виде параметрических запросов, которые могут открываться напрямую.
Для AJAX-сценария полезно разделить два уровня:
- визуальная фильтрация для пользователя;
- каноническая базовая страница для поисковика.
Если фильтр нужен только для удобства навигации, не давайте ему создавать индексируемые URL. Если же комбинация фильтров — это полноценная посадочная страница с уникальным спросом, её лучше оформлять отдельно, а не прятать под noindex.
Проверка результата после внедрения
После изменений не ограничивайтесь просмотром исходника. Проверьте несколько уровней:
- Откройте страницу с параметром, например
?sort=price, и посмотрите исходный код: в<meta name="robots">должен бытьnoindex. - Проверьте canonical: он должен указывать на основную версию страницы без лишних параметров.
- Сравните ответ сервера для базовой страницы и параметрической версии через
curl -Iили инструменты разработчика. - В Search Console отправьте проверку URL и посмотрите, как робот видит страницу после переобхода.
Пример быстрой проверки из терминала:
curl -I "https://example.com/category/shoes/?sort=price"
Если вы используете SEO-плагин, проверьте, не переопределяет ли он ваши правила. Иногда тема или плагин выводит свой canonical, а ваш код уже не влияет на итоговый HTML.
Частые ошибки и как их исправить
1. Закрыли URL в robots.txt и решили, что вопрос закрыт
Это частая ошибка. Disallow мешает обходу, но не гарантирует удаление из индекса, если URL уже известен. Для параметрических страниц чаще нужен noindex и нормальный canonical.
2. Поставили noindex на все страницы архива
Так можно случайно выключить полезные категории. Закрывать нужно только технические варианты: сортировку, фильтры, внутренний поиск, служебные параметры. Базовые категории и посадочные страницы должны оставаться доступными.
3. Canonical ведёт на несуществующий или параметрический URL
Если canonical сам содержит фильтры, поисковик не поймёт, какая версия основная. В результате дубли останутся, а сигнал станет слабее.
4. Не учли пагинацию
Пагинация сама по себе не всегда проблема. Но если она комбинируется с фильтрами, количество URL быстро растёт. В таких случаях нужно отдельно проверить, какие комбинации реально нужны пользователю, а какие только засоряют индекс.
Чек-лист перед публикацией изменений
- Список параметров для noindex составлен только из технических URL.
- Основные категории и посадочные страницы не закрыты.
- Canonical у параметрических страниц указывает на базовую версию.
- В исходном коде нет конфликтующих правил от темы и SEO-плагина.
- Проверены страницы сортировки, фильтров и внутреннего поиска.
- После обновления кэша и переобхода страница отдает ожидаемые мета-теги.
Что делать для безопасности и производительности
Если фильтров много, не пытайтесь решать всё через тяжёлые запросы и бесконечные комбинации параметров. Это не только SEO-проблема, но и нагрузка на базу. Ограничивайте допустимые значения, валидируйте входные параметры и не давайте фронтенду генерировать бесконтрольные URL.
Практически это означает:
- разрешать только известные значения сортировки;
- не хранить в URL лишние служебные параметры;
- очищать кэш после изменения логики фильтров;
- не дублировать одну и ту же страницу через несколько маршрутов.
Если на сайте уже накопились дубли, сначала закройте генерацию новых, а потом занимайтесь очисткой старых URL и переобходом. Иначе проблема будет возвращаться после каждого обновления каталога или темы.