Параметры в URL — частая причина дублей в WordPress. На одном и том же контенте могут появляться версии с ?utm_source=, ?sort=, ?filter=, ?replytocom= и другими хвостами. Для пользователя это одна страница, для поисковика — несколько разных адресов. В итоге расползаются сигналы, а в индексе остаются лишние URL.
Задача обычно не в том, чтобы «запретить всё подряд», а в том, чтобы:
- оставить индексируемой основную страницу без параметров;
- не пускать в индекс технические и рекламные параметры;
- не сломать аналитику, фильтры и сортировки, если они нужны посетителю;
- проверить, что canonical и robots работают согласованно.
Когда проблема уже есть: как её увидеть
Сначала стоит понять, какие именно параметры создают дубли. Не все из них одинаково опасны. UTM-метки обычно нужны только для аналитики, а replytocom и некоторые параметры сортировки часто плодят отдельные URL без реальной ценности.
Признаки дублей в индексе
- в поиске находятся URL с параметрами, хотя контент тот же;
- в отчётах Search Console появляются страницы с хвостами вроде
?utm_или?sort=; - одна и та же статья открывается по нескольким адресам;
- canonical указывает не туда или отсутствует;
- внутренние ссылки уже содержат параметры и размножают их дальше.
Проверка простая: откройте страницу с параметром и посмотрите исходный код. Если canonical ведёт на чистый URL, это уже хорошо, но этого недостаточно, если сам параметр продолжает индексироваться или массово попадать в обходные ссылки.
Что закрывать, а что оставлять
Не стоит пытаться закрыть все параметры одинаково. Для WordPress полезно разделить их на три группы.
| Тип параметра | Пример | Что делать |
|---|---|---|
| Аналитика | utm_source, utm_medium | Обычно не индексировать, canonical на чистый URL |
| Технические | replytocom, служебные хвосты плагинов | Закрывать от индексации и по возможности не генерировать |
| Пользовательские фильтры | sort, filter, price | Решать отдельно: иногда нужен noindex, иногда canonical, иногда вообще отдельная логика |
Если фильтр реально меняет смысл страницы и должен индексироваться, его нельзя бездумно закрывать. Но если параметр только меняет сортировку, цвет темы или источник перехода, индексировать его обычно не нужно.
Пошаговое решение: canonical, robots и редиректы
Самый безопасный сценарий — не ломать URL на уровне сервера, а сначала привести в порядок мета-теги и только потом при необходимости добавить редирект для отдельных параметров.
Шаг 1. Убедиться, что canonical указывает на чистый адрес
Большинство SEO-плагинов умеют ставить canonical автоматически. Но если у вас есть кастомные шаблоны или отдельные типы страниц, проверьте, что canonical не наследует параметры из текущего запроса.
Если нужно принудительно убрать параметры из canonical на фронтенде, можно использовать фильтр wpseo_canonical в Yoast SEO. Пример ниже удаляет query string из canonical:
<?php
add_filter( 'wpseo_canonical', function( $canonical ) {
if ( empty( $canonical ) ) {
return $canonical;
}
$parts = wp_parse_url( $canonical );
if ( empty( $parts['scheme'] ) || empty( $parts['host'] ) ) {
return $canonical;
}
$path = isset( $parts['path'] ) ? $parts['path'] : '';
return $parts['scheme'] . '://' . $parts['host'] . $path;
} );Если Yoast не используется, аналогичную задачу обычно решают в SEO-плагине или через собственный вывод <link rel="canonical"> в теме. Главное — не дублировать canonical из нескольких источников.
Шаг 2. Закрыть технические параметры через robots meta
Для отдельных параметров можно отдавать noindex,follow. Это не мешает поисковику переходить по ссылкам, но просит не включать страницу в индекс.
В WordPress это удобно делать через wp_robots. Ниже пример: если в URL есть replytocom или UTM-метки, добавляем noindex.
<?php
add_filter( 'wp_robots', function( array $robots ) {
$params = array( 'replytocom', 'utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content' );
foreach ( $params as $param ) {
if ( isset( $_GET[ $param ] ) ) {
$robots['noindex'] = true;
$robots['follow'] = true;
break;
}
}
return $robots;
} );Этот вариант подходит, если вам важно сохранить переходы по ссылкам и не устраивать жёсткую блокировку. Для рекламных меток это обычно нормальная практика.
Шаг 3. Для совсем лишних параметров сделать 301 на чистый URL
Если параметр не нужен ни пользователю, ни аналитике, ни функционалу, лучше не оставлять его в обращении. Тогда можно сделать редирект на URL без query string. Но делать это нужно аккуратно: не трогать POST-запросы, не ломать формы и не редиректить страницы, где параметр действительно нужен.
<?php
add_action( 'template_redirect', function() {
if ( is_admin() || wp_doing_ajax() ) {
return;
}
if ( empty( $_SERVER['REQUEST_URI'] ) ) {
return;
}
$allowed_params = array( 'preview', 'customize_changeset_uuid' );
$query_args = wp_unslash( $_GET );
if ( empty( $query_args ) ) {
return;
}
foreach ( $allowed_params as $allowed ) {
if ( isset( $query_args[ $allowed ] ) ) {
return;
}
}
$current_url = home_url( add_query_arg( array(), $_SERVER['REQUEST_URI'] ) );
$clean_url = remove_query_arg( array_keys( $query_args ), $current_url );
if ( $clean_url && $clean_url !== $current_url ) {
wp_safe_redirect( $clean_url, 301 );
exit;
}
} );Не советую применять такой редирект ко всем параметрам без списка исключений. Иначе можно сломать предпросмотр, настройку темы, фильтры в каталогах и часть интеграций.
Если параметры создаёт плагин или тема
Иногда источник дублей — не SEO-метки, а конкретный плагин: комментарии с replytocom, фильтры, сортировки, поиск по сайту, календарь, AJAX-виджеты. В этом случае лучше искать причину в генерации ссылок, а не только в индексации.
Что проверить в первую очередь:
- не добавляет ли тема параметры в навигацию и хлебные крошки;
- не сохраняются ли параметры в ссылках на внутренние страницы;
- не создаёт ли плагин отдельные URL для сортировки, которые не нужны в поиске;
- не дублируются ли страницы через пагинацию и фильтр одновременно;
- не конфликтует ли SEO-плагин с кастомным canonical в теме.
Если у вас Hueman и вы уже правили шаблоны, проверьте, не выводится ли canonical дважды: один раз через SEO-плагин, второй раз вручную в header.php или через action в дочерней теме. Двойной canonical — частая и неприятная ошибка.
Как проверить, что решение сработало
После внедрения не ограничивайтесь визуальной проверкой страницы. Нужно убедиться, что поисковик видит именно то, что вы задумали.
- Откройте URL с параметром и посмотрите исходный код страницы.
- Проверьте, что canonical указывает на чистый адрес без query string.
- Убедитесь, что в
<meta name="robots">или черезwp_robotsприсутствуетnoindex, если он нужен. - Проверьте HTTP-статус: если вы делали редирект, должен быть
301, а не302. - В Search Console отправьте проверку URL и посмотрите, как он определяется после переобхода.
Для быстрой локальной проверки удобно использовать:
curl -I "https://example.com/post/?utm_source=test"Если настроен редирект, в ответе должен быть 301 и заголовок Location с чистым URL. Если редиректа нет, смотрите HTML и canonical.
Частые ошибки и как их исправить
Закрыли параметр в robots.txt, но дубль остался
robots.txt не убирает уже известные поисковику URL из индекса мгновенно. Он только ограничивает обход. Если страница уже в индексе, обычно нужен canonical, noindex или редирект.
Поставили noindex на все страницы с параметрами и сломали фильтры
Такое часто происходит, когда под один шаблон попадают и UTM, и рабочие фильтры каталога. Решение — разделить параметры по назначению и закрывать только технические и мусорные.
Сделали 301 на все query string и потеряли аналитику
Если редиректить UTM, часть кампаний перестанет корректно фиксироваться на стороне сайта. Для рекламных меток чаще достаточно canonical и noindex, а редирект нужен только для действительно лишних параметров.
Canonical и редирект ведут в разные места
Это плохая комбинация. Canonical должен подтверждать финальный URL, а не спорить с редиректом. Если есть 301, canonical на старой странице должен исчезнуть вместе со страницей.
Параметры продолжают появляться во внутренних ссылках
Значит, проблема не в индексации, а в генерации ссылок. Ищите место, где параметр дописывается в шаблоне, меню, кнопке или JS-обработчике.
Чек-лист перед публикацией изменений
- определены параметры, которые нужно закрыть, и параметры-исключения;
- canonical на чистом URL;
- для технических параметров добавлен
noindex,follow; - редирект используется только там, где он действительно нужен;
- нет двойного canonical из темы и SEO-плагина;
- проверен HTTP-статус и заголовок
Location; - после правок страница открывается без ошибок и не ломает фильтры.
Практика безопасности и производительности
Чем меньше хаотичных URL, тем проще кэширование и обход сайта. Но не стоит писать универсальные правила на все случаи жизни прямо в .htaccess, если вы не уверены в структуре проекта. В WordPress безопаснее сначала проверить логику на уровне PHP и только потом переносить часть правил на сервер.
Если сайт большой, полезно вести список параметров, которые реально используются. Это помогает не только SEO, но и разработке: проще понять, какие query string можно убрать из шаблонов, а какие оставить для функционала.
Если нужен более системный подход к чистке дублей и технических хвостов, в экосистеме WPShop есть Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но даже с плагином важно проверить, какие именно параметры он закрывает, и не полагаться на настройки вслепую.
В рабочих проектах я бы начинал не с массового запрета, а с короткой диагностики: какие параметры реально индексируются, где они появляются и можно ли убрать их из генерации. Это обычно даёт более чистый результат, чем попытка «задушить» все URL одним правилом.