Страницы фильтра, сортировки и поиска часто создают в WordPress лишние URL с почти одинаковым содержимым. В итоге поисковик индексирует десятки дублей, а основной раздел теряет вес. Проблема обычно не в одной настройке, а в сочетании параметров в URL, шаблона темы и поведения плагинов.
Когда это действительно проблема
Сначала стоит убедиться, что речь не о полезных посадочных страницах, а именно о технических дублях. Типичный сценарий: у каталога или архива появляются адреса с параметрами вроде ?s=, ?orderby=, ?filter_, ?min_price=, ?max_price= или другими GET-параметрами. Контент на таких страницах отличается слабо, а иногда вообще не меняется, кроме заголовка и набора товаров или записей.
Блок диагностики проблемы
Проверьте три вещи:
- есть ли в Google Search Console страницы с параметрами в отчёте об индексировании;
- открываются ли такие URL со статусом
200 OKи полноценным HTML; - не создаёт ли тема отдельные канонические URL для каждого сочетания фильтров.
Если страница с фильтром доступна по прямой ссылке, отдает индексируемый HTML и отличается только набором параметров, это кандидат на закрытие от индексации. Если же фильтр нужен как отдельная посадочная страница для SEO, закрывать его целиком нельзя — тогда лучше пересмотреть логику генерации URL.
Что именно закрывать, а что оставить
Не стоит без разбора ставить noindex на весь архив или на все страницы поиска. Обычно закрывают:
- внутренний поиск сайта (
?s=); - сортировки и пагинацию фильтров, если они не несут самостоятельной ценности;
- технические параметры, которые меняют только отображение, но не смысл страницы;
- страницы с пустой выдачей или слишком узким набором результатов.
Оставляют в индексе только те URL, которые реально должны ранжироваться как посадочные. Если такие страницы нужны, у них должен быть стабильный адрес без лишних параметров, нормальный title, уникальный текст и понятная внутренняя перелинковка.
Пошаговое решение
Есть три рабочих подхода: через SEO-плагин, через серверные заголовки и через код темы или плагина. На практике чаще всего достаточно комбинации канонического URL и noindex для технических страниц.
| Подход | Когда использовать | Плюсы | Минусы |
|---|---|---|---|
| SEO-плагин | Если уже используется Yoast SEO, Rank Math или аналог | Быстро, без правок темы | Не всегда удобно для точечных правил по параметрам |
| Код в теме/плагине | Нужна точная логика для конкретных URL | Гибко, прозрачно, без лишних зависимостей | Нужно аккуратно тестировать |
| Серверные правила | Если надо убрать мусорные параметры до генерации страницы | Снижает нагрузку | Сложнее поддерживать, легко ошибиться |
Вариант через wp_robots
Если нужно закрыть от индексации страницы поиска и фильтра по параметрам, можно добавить правило в код. Это не заменяет канонический URL, но помогает поисковику не индексировать мусорные страницы.
<?php
add_filter( 'wp_robots', function( array $robots ) {
$is_search = is_search();
$has_filter_params = ! empty( $_GET['orderby'] ) || ! empty( $_GET['filter'] ) || ! empty( $_GET['min_price'] ) || ! empty( $_GET['max_price'] );
if ( $is_search || $has_filter_params ) {
$robots['noindex'] = true;
$robots['nofollow'] = true;
}
return $robots;
} );Этот вариант подходит, если фильтры реализованы через обычные GET-параметры. Если у вас сложный AJAX-фильтр, который меняет выдачу без перезагрузки, нужно смотреть, какой URL получает пользователь после применения фильтра, и уже его закрывать.
Канонический URL для параметрических страниц
Если страница с параметрами всё же открывается, но должна ссылаться на основную версию архива, задайте canonical на базовый URL. Это особенно полезно для сортировок и пагинации фильтров.
<?php
add_filter( 'get_canonical_url', function( $canonical, $post ) {
if ( is_search() ) {
return home_url( '/' );
}
if ( ! empty( $_GET['orderby'] ) || ! empty( $_GET['filter'] ) ) {
return get_post_type_archive_link( 'post' );
}
return $canonical;
}, 10, 2 );Здесь важно не подменить canonical на случайный URL. Он должен вести на основную, действительно релевантную страницу. Для архивов записей это может быть главная блога, для каталога — базовый архив нужного типа записи или таксономии.
Если используется SEO-плагин
В Yoast SEO и Rank Math можно управлять индексированием на уровне шаблонов и отдельных страниц. Это удобнее, если фильтр уже оформлен как отдельная страница или таксономия. Но для параметров в URL плагин не всегда покрывает все сценарии, поэтому код всё равно может понадобиться.
Практический подход такой: в плагине задайте noindex для шаблонов поиска и служебных архивов, а в коде добейте конкретные параметры, которые создают дубли. Так проще не сломать полезные страницы.
Проверка результата после внедрения
После изменений не ограничивайтесь просмотром исходника страницы. Проверьте цепочку целиком:
- в HTML есть
<meta name="robots" content="noindex, nofollow">или эквивалентный заголовок; - canonical указывает на нужный базовый URL;
- страница с параметрами не попадает в sitemap;
- в Search Console новые URL не получают статус «Проиндексировано»;
- при ручной проверке URL в браузере не создаётся отдельная SEO-страница.
Если используете серверные заголовки, проверьте ответ через DevTools или curl -I. Если работает только meta robots, убедитесь, что шаблон не переопределяется другим плагином.
curl -I "https://example.com/?s=test"Для быстрой проверки HTML можно открыть исходный код страницы и найти robots и canonical. Если там остались старые значения, значит фильтр срабатывает не на том хуке или конфликтует с SEO-плагином.
Частые ошибки и как их исправить
Закрывают весь сайт вместо технических URL
Иногда в коде ставят noindex по слишком широкому условию, например на все архивы или все страницы с GET-параметрами. В результате из индекса исчезают полезные посадочные. Исправление простое: ограничьте правило конкретными параметрами и конкретными шаблонами.
Оставляют индексируемый canonical на параметрическую страницу
Если canonical указывает на саму страницу с фильтром, поисковик может продолжать считать её отдельным документом. Для дублей canonical должен вести на основную версию, а не на URL с параметрами.
Пытаются закрыть дубли только через robots.txt
Disallow в robots.txt не убирает уже проиндексированные URL и не гарантирует их исчезновение из выдачи. Это полезно для обхода, но не заменяет noindex и canonical. Если URL уже в индексе, нужен именно сигнал на странице или заголовок X-Robots-Tag.
Не учитывают AJAX-фильтры
Если фильтр меняет выдачу без перезагрузки, но URL всё равно обновляется через History API, поисковик видит отдельные адреса. Проверьте, какие ссылки генерируются на фронтенде, и закрывайте именно их. Иногда проще отключить изменение URL для незначимых фильтров.
Безопасность и производительность
Не вставляйте условия на основе $_GET без проверки контекста, если код идёт в публичную тему. В приведённых примерах логика простая, но в реальном проекте лучше вынести её в отдельный мини-плагин. Так обновление темы не сломает SEO-настройки.
Если фильтров много, не делайте тяжёлые запросы в wp_head ради определения индексации. Используйте уже доступные условные теги WordPress и минимальное количество проверок. Чем меньше логики на каждой странице, тем меньше риск тормозов и конфликтов.
Для сайтов, где технических дублей много, полезно сначала навести порядок в шаблонах и параметрах URL, а потом уже подключать дополнительные инструменты чистки. В некоторых случаях помогает Clearfy Pro, если нужно убрать часть дублей и служебного мусора без ручной правки каждого шаблона, но базовую логику фильтров всё равно лучше держать под контролем в коде.
Как понять, что решение сработало
Признаки нормального результата довольно конкретные:
- в Search Console уменьшается число индексируемых URL с параметрами;
- страницы поиска и фильтров получают
noindexили каноникал на базовую версию; - основные страницы раздела не конкурируют с дублями;
- внутренние ссылки ведут на чистые адреса без лишних параметров;
- переобход сайта не показывает новые служебные URL в индексе.
Если после правок дубли всё ещё появляются, проверьте плагины фильтрации, кеширование и генерацию sitemap. Часто проблема не в одном месте, а в том, что один плагин закрывает URL, а другой снова добавляет их в карту сайта или в блоки перелинковки.