Дубли в WordPress обычно появляются не из-за одной ошибки, а из-за набора мелочей: архивы с разными параметрами, страницы пагинации, версии с и без слеша, HTTP и HTTPS, UTM-метки, теги, авторские архивы, а иногда и сам шаблон темы. Если не разобраться с источником, можно удалить не то и получить просадку в индексации вместо чистки сайта.
Ниже — рабочий сценарий: как быстро найти дубли, какие из них стоит закрывать от индексации, а какие — склеивать редиректом, и как проверить, что после правок сайт не потерял важные страницы.
Как понять, что у вас именно дубли, а не просто много страниц
Сначала стоит отличить нормальную структуру сайта от настоящего дубля. Для WordPress это важно: архивы категорий, пагинация и страницы автора сами по себе не проблема. Проблема начинается, когда одна и та же сущность доступна по нескольким URL и поисковик видит их как разные страницы.
Типичные источники дублей
- страницы с параметрами
?utm_source=,?fbclid=,?replytocom=; - версии URL с
wwwи без него; - HTTP и HTTPS одновременно;
- страницы тегов, архивов автора и дат, если они не нужны для поиска;
- пагинация, когда первая страница доступна и как архив, и как отдельный URL с параметрами;
- дубли из-за фильтров темы или плагина, которые создают отдельные URL для одного и того же контента.
Диагностика проблемы
Начните с простого: откройте несколько подозрительных URL и сравните их HTML-код. Если в <head> у них одинаковый канонический адрес, это уже хороший знак. Если canonical отсутствует или указывает на разные адреса для одной и той же страницы, источник дубля нужно искать в шаблоне или SEO-настройках.
Проверьте также, не индексируются ли параметры. Вручную это можно сделать через поиск по сайту в Google с оператором site:, но надёжнее смотреть отчёты в Google Search Console: разделы с дублированными, выбранными не той канонической страницей, и страницы, просканированные, но не проиндексированные.
Что делать сначала: закрыть мусорные URL или склеить основные
Здесь важно не смешивать задачи. Если URL технический и не должен жить сам по себе, его лучше закрыть от индексации или убрать через редирект. Если это реальная страница, но у неё есть варианты с параметрами, нужен canonical и, при необходимости, 301-редирект на чистый адрес.
| Сценарий | Что делать | Компромисс |
|---|---|---|
| UTM и служебные параметры | Canonical на чистый URL, при необходимости редирект | Параметры не будут отдельными страницами |
| HTTP / www / слеш | 301 на единую версию | Нужно выбрать один стандарт для всего сайта |
| Архивы тегов и автора | Noindex или отключение архивов | Часть внутренних страниц исчезнет из поиска |
| Пагинация архивов | Оставить доступной, но с корректным canonical | Нельзя бездумно закрывать все страницы пагинации |
Пошаговое решение: как убрать дубли в WordPress
1. Выберите единую каноническую версию сайта
Сначала определитесь, какой адрес считается основным: https://example.ru или https://www.example.ru. После этого настройте редирект на уровне сервера или WordPress. Если у вас уже есть SEO-плагин, проверьте, не конфликтует ли его логика с правилами сервера.
Для принудительного редиректа на HTTPS и без www можно использовать такой код в functions.php темы или в мини-плагине:
add_action('template_redirect', function () {
if (is_admin() || wp_doing_ajax()) {
return;
}
$host = $_SERVER['HTTP_HOST'] ?? '';
$uri = $_SERVER['REQUEST_URI'] ?? '/';
$target_host = 'example.ru';
$is_https = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off');
if ($host === 'www.example.ru' || !$is_https) {
wp_safe_redirect('https://' . $target_host . $uri, 301);
exit;
}
});Этот вариант годится только если вы понимаете, что делаете, и уже проверили, что сайт корректно работает по HTTPS. Если редирект настроен на сервере, в PHP его дублировать не нужно.
2. Уберите параметры, которые создают мусорные URL
Чаще всего это UTM-метки и служебные параметры от шаринга. Для них не нужен отдельный контент. Если параметр не влияет на содержимое страницы, его можно игнорировать в canonical и при необходимости редиректить на чистый URL.
add_action('template_redirect', function () {
if (is_admin() || wp_doing_ajax()) {
return;
}
$ignore_params = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'replytocom'];
$query = $_GET;
$has_ignored = false;
foreach ($ignore_params as $param) {
if (isset($query[$param])) {
unset($query[$param]);
$has_ignored = true;
}
}
if (!$has_ignored) {
return;
}
$path = strtok($_SERVER['REQUEST_URI'] ?? '/', '?');
$clean_url = home_url($path);
if (!empty($query)) {
$clean_url = add_query_arg($query, $clean_url);
}
wp_safe_redirect($clean_url, 301);
exit;
});Если на сайте есть фильтры каталога, поиск по сайту или сортировка, не удаляйте все параметры подряд. Сначала проверьте, какие из них реально меняют выдачу и должны оставаться доступными.
3. Настройте canonical для архивов и страниц с параметрами
Если URL должен открываться, но не должен конкурировать с основной страницей, canonical помогает поисковику выбрать правильную версию. В WordPress это часто решается через SEO-плагин, но при кастомной логике можно добавить свой тег через wp_head.
add_action('wp_head', function () {
if (is_admin()) {
return;
}
if (isset($_GET['utm_source']) || isset($_GET['fbclid']) || isset($_GET['gclid'])) {
$canonical = home_url( strtok($_SERVER['REQUEST_URI'] ?? '/', '?') );
echo '<link rel="canonical" href="' . esc_url($canonical) . '" />' . "\n";
}
}, 1);Этот пример не заменяет полноценную SEO-настройку, а только показывает принцип. Если у вас уже стоит плагин, который выводит canonical, убедитесь, что не получается два тега сразу.
4. Закройте ненужные архивы от индексации
Если на сайте нет смысла в архивах автора, дат или тегов, их лучше не тащить в индекс. Но отключать всё подряд не стоит: иногда теговые страницы дают хороший внутренний трафик и помогают навигации.
Практический подход такой: сначала посмотрите в Search Console, есть ли у этих архивов показы и клики. Если нет, можно закрывать. Если есть — сначала проверьте, можно ли улучшить их контент, а не убирать целиком.
Как проверить, что решение сработало
После внедрения правок не ограничивайтесь открытием главной страницы. Проверьте несколько сценариев:
- URL с
wwwдолжен вести на основную версию сайта через 301; - HTTP должен редиректить на HTTPS;
- страницы с UTM должны открываться без отдельной индексации или сразу уходить на чистый URL;
- в исходном коде должен быть один canonical, а не несколько;
- в Search Console новые URL должны постепенно исчезать из отчётов как дублированные.
Для быстрой проверки удобно использовать команду curl:
curl -I https://www.example.ru/page/?utm_source=testВ ответе смотрите статус 301 и заголовок Location. Если вместо редиректа вы видите 200, значит правило не сработало или его перебивает другой слой — сервер, кеш или плагин.
Частые ошибки и как их исправить
Ставят noindex вместо редиректа там, где нужен один адрес
Если у страницы есть явный дубль с другим URL, noindex не решает проблему полностью. Поисковик всё равно будет тратить ресурсы на обход дубля. Для канонических вариантов лучше 301-редирект.
Удаляют все архивы, не проверив внутреннюю перелинковку
После отключения архивов могут сломаться хлебные крошки, блоки похожих записей и навигация по сайту. Проверьте, не завязаны ли на них шаблоны темы или виджеты.
Добавляют редиректы и в .htaccess, и в PHP одновременно
Так легко получить цепочку редиректов или бесконечный цикл. Выберите один уровень управления: сервер или WordPress. Если на сервере уже есть правила, PHP-обработчик лучше не дублировать.
Закрывают параметры, которые реально меняют контент
Это частая ошибка на сайтах с фильтрами. Если параметр отвечает за сортировку, поиск или фильтрацию, его нельзя просто выкинуть из URL без проверки логики шаблона.
Чек-лист перед публикацией правок
- выбрана одна основная версия домена;
- настроен 301-редирект с дублей;
- параметры UTM и служебные хвосты не создают отдельные страницы;
- canonical выводится один раз и на правильный URL;
- ненужные архивы либо закрыты, либо осознанно оставлены;
- проверены редиректы через
curlи вручную в браузере; - в Search Console нет новых массовых ошибок после изменений.
Что стоит учесть для безопасности и производительности
Если вы решаете проблему кодом, не разбрасывайте логику по теме. Лучше вынести её в небольшой mu-plugin или отдельный плагин сайта. Тогда при смене темы редиректы и canonical не исчезнут.
Ещё один момент — кеш. После настройки редиректов и canonical очистите серверный кеш, кеш плагина и, если есть, CDN. Иначе вы будете проверять старую версию страницы и решите, что правка не работает.
Если нужен более системный подход к чистке дублей, технических архивов и SEO-хаоса, удобно держать это в отдельном наборе настроек, а не размазывать по шаблонам. В таких сценариях иногда используют Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но даже с плагином полезно понимать, какие именно URL вы закрываете и почему.
Если после чистки дублей сайт стал вести себя странно, не начинайте с удаления кода. Сначала отключите кеш, проверьте цепочки редиректов и сравните HTML исходной и канонической страниц. В WordPress такие проблемы чаще всего оказываются не в SEO-плагине, а в конфликте нескольких правил одновременно.