На WordPress дубли чаще всего появляются не из-за самих записей, а из-за URL с параметрами: ?replytocom=, ?utm_, фильтров, сортировок, страниц поиска и служебных переходов. Если такие адреса попадают в индекс, поисковик видит несколько версий одной и той же страницы, а это уже лишний шум в обходе и размывание сигналов.
Ниже разберём рабочий сценарий: как закрыть от индексации страницы с параметрами, не ломая нормальную навигацию и не трогая админку.
Когда проблема действительно в параметрах URL
Сначала нужно убедиться, что речь не о случайных единичных дублях. Откройте отчёт по страницам в поисковой системе или выгрузку из краулера и посмотрите, какие адреса повторяются. Если у них один и тот же контент, но разные query string, это типичный кандидат на закрытие.
Признаки, которые видно без сложной диагностики
- в индексе есть версии страниц с
?replytocom=; - поисковик показывает URL с UTM-метками или внутренними параметрами сортировки;
- страницы поиска по сайту индексируются как отдельные документы;
- в логах краулера много обращений к адресам вида
/page/2/?sort=priceили похожим комбинациям.
Если проблема только в одном типе параметра, не стоит сразу закрывать всё подряд через robots.txt. Это грубый инструмент: он может скрыть URL от обхода, но не всегда решает вопрос с уже известными дублями. Для точечной задачи лучше использовать заголовки noindex и нормализацию поведения на уровне шаблона.
Что именно закрывать, а что оставить
Не все параметры одинаково вредны. Например, UTM-метки полезны для аналитики, но их не нужно индексировать. А вот параметры сортировки и внутренние фильтры часто создают десятки почти одинаковых страниц. Для них логика обычно такая: если параметр не меняет смысл страницы для поиска, его надо закрыть от индексации.
| Подход | Когда подходит | Минус |
|---|---|---|
| Плагин SEO/clean-up | Нужно быстро закрыть типовые дубли без кода | Меньше контроля над точечными исключениями |
| Код в теме или mu-plugin | Нужна точная логика по параметрам и шаблонам | Требует проверки после обновлений |
| robots.txt | Нужно снизить обход служебных URL | Не всегда убирает уже известные дубли из индекса |
Если нужен именно аккуратный контроль дублей и технической чистки, в экосистеме WPShop для этого уместно смотреть в сторону Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но если задача точечная и вы ведёте проект кодом, плагин не обязателен.
Пошаговое решение через код
Самый надёжный вариант — добавить noindex, follow для страниц с нежелательными параметрами. Так поисковик не будет индексировать такие URL, но сможет проходить по ссылкам дальше. Код лучше класть в mu-plugin или в дочернюю тему, чтобы не потерять его при обновлении.
1. Определяем список параметров
Сначала соберите реальные параметры, которые появляются на сайте. Не надо писать универсальный фильтр на всё подряд. Обычно достаточно нескольких конкретных ключей: replytocom, sort, order, filter, utm_source, utm_medium, utm_campaign.
2. Добавляем мета robots для фронтенда
<?php
add_action('wp_head', function () {
if (is_admin()) {
return;
}
$blocked_params = [
'replytocom',
'sort',
'order',
'filter',
'utm_source',
'utm_medium',
'utm_campaign',
'utm_term',
'utm_content',
];
foreach ($blocked_params as $param) {
if (isset($_GET[$param])) {
echo "<meta name=\"robots\" content=\"noindex,follow\" />\n";
break;
}
}
}, 1);Этот вариант простой и работает для большинства тем. Но если у вас уже подключён SEO-плагин, проверьте, не перезаписывает ли он robots meta. Иначе можно получить конфликт: в исходнике будет одна директива, а в рендере — другая.
3. Для служебных параметров можно добавить canonical на чистый URL
Если параметр не меняет контент, полезно указывать канонический адрес без query string. Это помогает поисковику быстрее понять, какая версия основная.
<?php
add_filter('get_canonical_url', function ($canonical, $post) {
if (is_admin() || ! $canonical) {
return $canonical;
}
$params = ['replytocom', 'sort', 'order', 'filter', 'utm_source', 'utm_medium', 'utm_campaign'];
foreach ($params as $param) {
if (isset($_GET[$param])) {
return get_permalink($post);
}
}
return $canonical;
}, 10, 2);Здесь важный момент: canonical не должен вести на нерелевантную страницу. Если параметр реально меняет контент, например сортировка товаров или архив по фильтру, каноникал на базовую страницу может быть спорным. В таком случае лучше оставить canonical как есть и закрыть только индексацию.
Если нужно закрыть только отдельные шаблоны
Иногда проблема не в параметрах вообще, а в конкретных типах страниц: поиск, архивы с фильтрами, страницы пагинации с параметрами. Тогда логика должна быть не по $_GET, а по условным тегам WordPress.
<?php
add_action('wp_head', function () {
if (is_admin()) {
return;
}
if (is_search() || is_404()) {
echo "<meta name=\"robots\" content=\"noindex,follow\" />\n";
return;
}
if (is_paged() && ! empty($_GET)) {
echo "<meta name=\"robots\" content=\"noindex,follow\" />\n";
}
}, 1);Такой вариант полезен, если на сайте много архивов и пагинации, а параметры только усиливают проблему. Но не используйте его бездумно: если у вас SEO-ценные страницы пагинации, их лучше анализировать отдельно.
Проверка результата после внедрения
После правки не ограничивайтесь просмотром исходника в браузере. Нужно проверить, что директива реально отдается на нужных URL и не появляется там, где не нужна.
- Откройте страницу с параметром, например
?utm_source=testили?replytocom=1. - Посмотрите исходный код страницы и найдите
<meta name="robots" content="noindex,follow" />. - Проверьте canonical: он должен вести на чистый URL, если вы его меняли.
- Прогоните проблемный URL через краулер или инструмент проверки URL в поисковой системе.
- Убедитесь, что обычные страницы без параметров не получили лишний
noindex.
Если у вас включён кэш страниц, очистите его перед проверкой. Иначе можно смотреть старую версию HTML и сделать ложный вывод, что код не работает.
Частые ошибки и как их исправить
Закрыли всё через robots.txt и ждёте исчезновения дублей
Это частая ошибка. Disallow помогает снизить обход, но не гарантирует, что уже известные URL исчезнут из индекса. Для дублей с параметрами обычно нужен noindex или корректный canonical.
Поставили noindex на все страницы с query string
Так можно случайно закрыть полезные URL, например страницы авторизации, поиска или фильтров, которые должны быть доступны пользователю. Сначала составьте список параметров, потом тестируйте на нескольких типах страниц.
Не учли конфликт с SEO-плагином
Если плагин уже выводит свои robots meta и canonical, ваш код может не сработать или сработать частично. В этом случае проверьте источник тега в HTML и оставьте только один механизм управления.
Использовали canonical на главную вместо чистого URL
Это ломает смысл страницы и может ухудшить индексацию. Canonical должен указывать на эквивалентную версию, а не на случайную страницу.
Что делать для безопасности и производительности
Если на сайте много параметров, они создают не только SEO-проблему, но и лишнюю нагрузку: больше обхода, больше кеш-ключей, больше мусора в логах. Здесь помогает дисциплина на уровне шаблонов и кеша.
- не плодите параметры в ссылках без необходимости;
- для UTM используйте их только в рекламных ссылках, а не во внутренней перелинковке;
- проверяйте, не генерирует ли тема лишние query string в меню, фильтрах и кнопках;
- если используете page cache, убедитесь, что он не хранит отдельную копию для каждого UTM-параметра;
- для массовой чистки дублей и технических настроек удобнее держать отдельный список правил, а не править код в нескольких местах.
Если проекту нужен не только контроль индексации, но и общая техническая чистка WordPress, можно посмотреть в сторону Clearfy Pro как готового набора для типовых SEO- и performance-задач: https://wpshop.ru/plugins/clearfy. Но для точечной задачи с параметрами достаточно и аккуратного кода.
После внедрения держите под наблюдением отчёт по страницам с параметрами хотя бы несколько обходов поискового робота. Если новые дубли продолжают появляться, значит источник параметров не закрыт: либо их генерирует тема, либо внешний сервис, либо фильтр в плагине.