wp3.ru wordpress wp3.ru

Как убрать дубли от фильтров и параметров в WordPress

Если на сайте появились десятки одинаковых 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.

×
Сделай WordPress мощнее!

Скидка -20% на топовые премиум плагины

Выбрать плагин сейчас ⋙