Страницы фильтров и сортировок в WordPress часто появляются сами: из-за параметров в URL, AJAX-фильтрации, плагинов каталога или шаблонов архива. В итоге в индекс попадают десятки почти одинаковых страниц, а в Search Console растут URL с параметрами, которые не несут отдельной ценности. Полностью «рубить» такие страницы нельзя: часть из них нужна пользователю и поисковику, но часть действительно стоит закрыть.
Ниже — практический сценарий: как понять, какие URL фильтра надо закрывать, чем отличается noindex от canonical, как это сделать кодом и как проверить, что решение работает.
Когда фильтр нужно закрывать, а когда нет
Не каждый URL с параметром — мусор. Если фильтр создаёт отдельную полезную посадочную страницу, например «ноутбуки до 50 000» или «синие кроссовки 42 размера», её можно оставить в индексе, если на ней есть уникальный контент, нормальный title и понятная внутренняя ссылка. Но если это комбинация вроде ?sort=price_asc&brand=asus&in_stock=1, которая не даёт новой ценности, такую страницу лучше не индексировать.
Диагностика проблемы
Сначала посмотрите, какие URL уже индексируются. Для этого полезны:
- отчёт «Страницы» в Google Search Console;
- логика URL в шаблонах архива и фильтра;
- поиск по сайту через
site:example.comс параметрами; - проверка ответа сервера и мета-тегов на страницах фильтра.
Если в индексе есть URL с параметрами, а в выдаче они конкурируют с основными страницами категорий, проблема уже не только в дублях. Поисковик тратит обход на бесполезные комбинации, а канонический URL может игнорироваться, если разметка сделана непоследовательно.
Какой способ выбрать: noindex, canonical или robots.txt
Для фильтров в WordPress чаще всего работают три подхода, но у каждого свой сценарий применения.
| Подход | Когда использовать | Плюс | Минус |
|---|---|---|---|
noindex, follow | Для страниц, которые должны быть доступны, но не нужны в индексе | Страница остаётся для пользователя и ссылок | Нужно корректно отдавать мета-тег на всех вариантах URL |
canonical | Когда параметр не меняет смысл страницы и есть основная версия | Помогает склеивать сигналы | Не всегда достаточно, если URL активно генерируются |
robots.txt | Для явного отсечения технических параметров и служебных путей | Снижает обход мусорных URL | Не убирает уже проиндексированные страницы и может мешать переобходу |
На практике для фильтров лучше сочетать noindex и canonical, а robots.txt использовать только для действительно технических путей, которые не должны обходиться вообще.
Пошаговое решение через код темы или мини-плагин
Если фильтр строится на параметрах в URL, проще всего добавить логику в wp_head. Это не требует отдельного SEO-плагина и позволяет точно контролировать, какие параметры закрывать.
1. Определите список параметров
Сначала решите, какие параметры считаются техническими. Обычно это сортировка, пагинация фильтра, флаги наличия, служебные переключатели интерфейса. Не включайте сюда параметры, которые формируют полезные посадочные страницы.
<?php
add_action('wp_head', function () {
if (is_admin() || is_feed()) {
return;
}
$technical_params = ['sort', 'orderby', 'order', 'filter', 'min_price', 'max_price', 'in_stock'];
$has_technical_params = false;
foreach ($technical_params as $param) {
if (isset($_GET[$param]) && $_GET[$param] !== '') {
$has_technical_params = true;
break;
}
}
if (!$has_technical_params) {
return;
}
echo '<meta name="robots" content="noindex,follow" />' . "\n";
}, 1);Этот вариант закрывает страницы с техническими параметрами, но не мешает пользователю открывать их. Поисковик увидит noindex,follow и не будет держать такие URL в индексе, но сможет переходить по ссылкам дальше.
2. Добавьте canonical на основную версию
Если фильтр не должен иметь отдельной поисковой ценности, canonical лучше указывать на чистый URL категории или архива. Так вы передаёте сигналы на основную страницу и уменьшаете риск склейки мусорных комбинаций.
<?php
add_action('wp_head', function () {
if (is_admin() || is_feed()) {
return;
}
if (!is_tax() && !is_post_type_archive()) {
return;
}
$technical_params = ['sort', 'orderby', 'order', 'filter', 'min_price', 'max_price', 'in_stock'];
foreach ($technical_params as $param) {
if (!empty($_GET[$param])) {
$canonical = get_term_link(get_queried_object());
if (!is_wp_error($canonical)) {
echo '<link rel="canonical" href="' . esc_url($canonical) . '" />' . "\n";
}
break;
}
}
}, 20);Здесь важно не подставлять каноникал наугад. Если фильтр действительно создаёт отдельную полезную страницу, canonical должен вести на неё саму, а не на родительскую категорию.
3. Для служебных URL ограничьте обход в robots.txt
Если плагин или тема генерируют совсем технические пути, можно закрыть их от обхода в robots.txt. Но не используйте этот способ для уже проиндексированных страниц фильтра как единственный механизм — поисковик может продолжать держать их в индексе без переобхода.
User-agent: *
Disallow: /?sort=
Disallow: /?orderby=
Disallow: /?filter=
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.phpС параметрами в robots.txt нужно быть осторожным: не все поисковые системы одинаково интерпретируют такие правила. Поэтому это скорее дополнительный слой, а не основное решение.
Если фильтр строит плагин каталога
У многих плагинов есть собственные настройки SEO для фильтров, но они не всегда закрывают все сценарии. Проверьте, умеет ли плагин:
- отключать индексацию страниц с параметрами;
- задавать canonical для фильтрованных URL;
- не создавать отдельные страницы для пустых комбинаций;
- скрывать технические параметры из sitemap.
Если таких настроек нет, код выше можно вынести в мини-плагин или в functions.php дочерней темы. Для долгосрочной поддержки мини-плагин надёжнее: он не слетит при смене темы.
Проверка результата после внедрения
После правки не ограничивайтесь просмотром исходника в браузере. Проверьте несколько уровней сразу:
- Откройте URL фильтра с параметром и убедитесь, что в
<head>появилсяnoindex,follow. - Проверьте canonical: он должен вести на нужную основную страницу, а не на случайный URL.
- Посмотрите ответ сервера через
curl -Iили инструменты разработчика, чтобы исключить редиректы и кешированные старые заголовки. - В Search Console запросите проверку URL и посмотрите, как Google видит страницу.
Пример быстрой проверки через консоль:
curl -s https://example.com/catalog/?sort=price_asc | grep -iE 'robots|canonical'Если страница отдается из кеша, а мета-теги не меняются, проблема может быть не в коде, а в серверном или плагинном кеше. Тогда очистите кеш страницы, объектный кеш и CDN, если он используется.
Частые ошибки и как их исправить
Закрыли всё через robots.txt и забыли про индекс
Это частая ошибка: URL уже в индексе, но вы запретили обход. В результате поисковик ещё долго хранит старые страницы. Исправление простое: сначала вернуть доступ для переобхода, добавить noindex или canonical, затем дождаться переобхода.
Поставили canonical на главную вместо категории
Так теряется смысл страницы и ломается кластеризация. Canonical должен указывать на наиболее близкую основную версию контента. Для фильтра категории это обычно сама категория без параметров, а не корень сайта.
Закрыли полезные посадочные страницы
Если фильтр даёт реальный спрос и уникальный набор товаров или записей, не закрывайте его автоматически только из-за наличия параметра. Сначала оцените, есть ли у страницы уникальный title, текст, внутренние ссылки и стабильный спрос. Иначе можно убрать из индекса то, что приносит трафик.
Не учли кеш
После изменения шаблона мета-теги могут не обновиться из-за page cache, object cache или CDN. В таком случае проверка в браузере покажет старую версию, и вы решите, что код не работает. Сначала очищайте кеш, потом проверяйте.
Чек-лист перед публикацией правки
- Определены технические и полезные параметры URL.
- Для мусорных комбинаций стоит
noindex,follow. - Canonical ведёт на правильную основную страницу.
- Служебные пути при необходимости ограничены в
robots.txt. - Проверен кеш страницы, объектный кеш и CDN.
- URL протестирован в Search Console и в исходнике страницы.
Практика безопасности и производительности
Не генерируйте бесконечные комбинации фильтров без ограничений. Это создаёт нагрузку на базу данных, раздувает индекс и усложняет обход. Если фильтр строится на запросах к мета-полям или таксономиям, следите за количеством JOIN и не давайте пользователю собирать десятки параметров в одном URL.
Если вы используете SEO-плагин или комплексную оптимизацию, проверьте, не конфликтует ли его логика с кодом темы. Например, если плагин уже добавляет canonical или управляет мета-robots, дублирование в теме может дать противоречивые сигналы. В таких случаях лучше оставить один источник правды.
Для сайтов, где фильтры и дубли уже накопились, полезно сначала навести порядок в технической SEO-базе, а потом расширять логику. Если нужен инструмент для чистки дублей, мета-тегов и служебных URL, можно посмотреть Clearfy Pro: https://wpshop.ru/plugins/clearfy.
Главная идея простая: не закрывайте фильтры «на всякий случай». Сначала разделите полезные и технические URL, потом задайте для каждого свой режим индексации. Тогда сайт не потеряет нужные посадочные страницы и перестанет раздувать индекс мусорными комбинациями.