Если в индексе начали появляться URL вида ?utm_source=, ?replytocom=, ?sort= или другие служебные параметры, проблему лучше решать не точечно через удаление отдельных страниц, а на уровне правил для всего сайта. Иначе дубли будут возвращаться после каждой новой кампании, фильтра, виджета или формы.
Ниже разберём рабочую схему: как понять, какие параметры реально вредят, чем закрывать их от индексации, как не сломать аналитику и как проверить, что поисковики перестали считать такие URL отдельными страницами.
Когда параметры становятся проблемой
Не каждый URL с параметром нужно закрывать. UTM-метки, gclid, fbclid и похожие параметры часто нужны для аналитики, но не для индексации. Проблема возникает, когда поисковик видит одну и ту же страницу в десятках вариантов и начинает расходовать краулинговый бюджет на мусорные адреса.
Типичные сценарии
- в ссылках из рекламы и рассылок постоянно появляются UTM-параметры;
- на сайте есть сортировка, фильтры, пагинация с query string;
- комментарии создают URL с
replytocom; - плагины или тема добавляют служебные параметры к внутренним ссылкам;
- в Search Console растёт число «дублированных страниц, выбран другой канонический URL».
Диагностика: какие URL реально индексируются
Сначала проверьте, что именно попало в индекс. Не стоит закрывать всё подряд только потому, что в адресе есть знак вопроса. Иногда параметр не мешает, а иногда наоборот создаёт отдельную страницу с уникальным контентом.
Что смотреть в первую очередь
- отчёт «Страницы» в Google Search Console;
- поиск по сайту через
site:example.com inurl:?; - логи сервера, если нужно понять, какие параметры чаще всего сканируются;
- канонические URL в HTML-коде страницы.
Если одна и та же статья доступна по нескольким адресам, но контент не меняется, это кандидат на закрытие от индексации. Если параметр меняет содержимое существенно, например фильтр каталога, решение нужно принимать отдельно для каждого типа URL.
Что выбрать: robots.txt, noindex или canonical
У этих способов разная задача. Ошибка многих сайтов — пытаться решить всё через robots.txt. Это не всегда работает так, как ожидают.
| Подход | Когда использовать | Ограничение |
|---|---|---|
noindex | Когда страницу можно сканировать, но не нужно держать в индексе | Нужно, чтобы робот смог увидеть тег |
canonical | Когда есть основной URL и его параметры-дубликаты | Не гарантирует мгновенное исключение из индекса |
robots.txt | Когда нужно ограничить обход технических URL | Запрещённые URL могут оставаться в индексе без контента |
Для параметров на контентных страницах чаще всего подходит связка: канонический URL на чистую версию + noindex,follow для служебных вариантов. Если речь о совсем технических адресах, можно дополнительно закрыть их в robots.txt.
Пошаговое решение в WordPress
Шаг 1. Добавьте noindex для URL с параметрами
Если у вас нет SEO-плагина, который уже умеет это делать, можно добавить правило в тему или мини-плагин. Ниже пример, который ставит noindex,follow для страниц с типичными служебными параметрами.
add_action('wp_head', function () {
if (is_admin() || is_feed() || is_404()) {
return;
}
$params = array('utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'gclid', 'fbclid', 'replytocom', 'sort', 'filter');
foreach ($params as $param) {
if (isset($_GET[$param])) {
echo "<meta name=\"robots\" content=\"noindex,follow\" />\n";
break;
}
}
}, 1);Этот вариант простой, но его лучше использовать только если вы понимаете, какие параметры реально встречаются на сайте. Не стоит бездумно закрывать все query string: можно случайно затронуть рабочие страницы поиска или фильтров.
Шаг 2. Укажите канонический URL без параметров
Для страниц, где параметр не меняет смысл контента, canonical должен указывать на чистую версию URL. Это помогает поисковику понять, какой адрес считать основным.
add_filter('get_canonical_url', function ($canonical, $post) {
if (empty($_GET)) {
return $canonical;
}
$remove = array('utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'gclid', 'fbclid', 'replytocom', 'sort', 'filter');
$url = remove_query_arg($remove, $canonical);
return $url;
}, 10, 2);Если у вас уже стоит Yoast SEO, Rank Math или другой SEO-плагин, не дублируйте логику в коде без необходимости. Сначала проверьте, умеет ли плагин задавать canonical и noindex для архивов, параметров и страниц поиска.
Шаг 3. Закройте технические параметры в robots.txt только там, где это уместно
Для совсем служебных адресов можно добавить правила в robots.txt через фильтр WordPress. Но не используйте это как единственный способ убрать дубли из индекса.
add_filter('robots_txt', function ($output, $public) {
$output .= "\nUser-agent: *\n";
$output .= "Disallow: /*?replytocom=\n";
$output .= "Disallow: /*?sort=\n";
$output .= "Disallow: /*?filter=\n";
return $output;
}, 10, 2);Если сайт большой, лучше сначала протестировать правило на одном типе параметра. Слишком широкая маска может задеть нужные страницы и ухудшить обход сайта.
Если используете SEO-плагин
В большинстве случаев удобнее настроить это через SEO-плагин, а не через код. Так проще управлять исключениями и не держать логику в теме. Например, в плагинах уровня Clearfy Pro можно закрывать служебные страницы, чистить дубли и управлять техническими настройками без правки шаблонов. Если нужен именно такой сценарий, смотрите настройки по удалению дублей и технической чистке сайта: https://wpshop.ru/plugins/clearfy.
Но даже с плагином полезно понимать механику: плагин не заменяет диагностику. Если параметр создаёт отдельный контент, его нельзя просто бездумно закрыть от индексации.
Как проверить, что решение сработало
После внедрения не ограничивайтесь визуальной проверкой исходника. Нужно убедиться, что поисковый робот видит нужные сигналы.
- откройте URL с параметром и проверьте наличие
<meta name="robots" content="noindex,follow" />; - проверьте canonical: он должен вести на чистый URL без лишних параметров;
- в Search Console отправьте проверку URL и посмотрите, как страница интерпретируется роботом;
- через несколько обходов проверьте, уменьшается ли число дублей в отчётах;
- убедитесь, что аналитика по UTM не сломалась и данные по кампаниям продолжают собираться.
Если страница всё ещё индексируется, причина часто в одном из двух мест: робот не видит тег noindex из-за блокировки в robots.txt, либо на сайте есть другой источник canonical, который переопределяет ваш код.
Частые ошибки и как их исправить
Закрыли в robots.txt, но URL остались в индексе
Это ожидаемо. Запрет обхода не равен удалению из индекса. Если страница уже известна поисковику, нужен noindex или корректный canonical, а не только Disallow.
Поставили noindex на все страницы с вопросительным знаком
Так можно случайно закрыть внутренний поиск, фильтры или страницы, которые должны индексироваться. Список параметров должен быть конкретным, а не абстрактным.
Сломали аналитику
Если вы переписываете URL через редирект или агрессивно удаляете параметры на сервере, UTM может перестать доходить до системы аналитики. Для SEO чаще достаточно noindex и canonical без редиректа.
Конфликт с SEO-плагином
Если плагин уже выводит canonical и robots meta, ваш код может создать дубли тегов. В таком случае оставьте один источник истины: либо настройка в плагине, либо собственный код.
Практические советы по безопасности и производительности
Не используйте слишком тяжёлые проверки в wp_head. Для такой задачи достаточно посмотреть на массив $_GET и вывести один мета-тег. Это почти не влияет на производительность.
Если параметры используются на публичных формах, не храните логику закрытия от индексации только в JavaScript. Поисковый робот может не выполнить скрипт так, как вы ожидаете. Серверный вывод meta robots и canonical надёжнее.
Для крупных сайтов полезно вести список параметров централизованно, а не размазывать его по нескольким файлам темы. Тогда проще сопровождать правила и не забывать, почему тот или иной URL был закрыт.
Если нужен более широкий контроль над техническим мусором, дубликатами и SEO-настройками, лучше вынести это в отдельный плагин или использовать готовое решение, а не держать всё в functions.php. Это снижает риск потерять правила при смене темы.