Дубли страниц в WordPress часто появляются не из-за «плохого SEO-плагина», а из-за вполне обычных вещей: параметров в URL, сортировок, фильтров, пагинации, UTM-меток и служебных страниц, которые индексируются отдельно. В результате поисковик видит несколько адресов с одинаковым или почти одинаковым контентом и начинает тратить обход на мусорные варианты.
Ниже разберём практический сценарий: как найти такие дубли, какие из них закрывать canonical, какие — noindex, а какие лучше редиректить. Без лишней теории, с проверяемыми шагами и кодом там, где он действительно нужен.
Как понять, что проблема именно в дублях URL
Сначала стоит убедиться, что речь не о банальной индексации всех страниц подряд. У дублей обычно есть характерные признаки:
- в Search Console растёт число страниц с пометкой «Просканировано, но не проиндексировано» или «Дубликат, Google выбрал другой канонический URL»;
- одна и та же страница открывается по разным адресам: с параметрами
?sort=,?filter=,?utm_; - в выдаче встречаются URL с разным хвостом, хотя контент на них одинаковый;
- в логах или аналитике видно много входов на технические варианты страниц;
- в sitemap попадают адреса, которые не должны индексироваться.
Что проверить в первую очередь
Откройте проблемную страницу в нескольких вариантах URL и сравните:
- есть ли одинаковый контент;
- меняется ли
<link rel="canonical">; - не создаёт ли тема или плагин отдельные архивы под фильтры;
- не индексируются ли параметры, которые нужны только для аналитики или сортировки.
Если canonical указывает на основной URL, но в индексе всё равно копятся дубли, значит проблема не только в canonical. Обычно нужен ещё запрет индексации для технических вариантов или редирект.
Какие дубли бывают в WordPress на практике
У WordPress есть несколько типичных источников дублей. Они отличаются по способу лечения, и это важно не перепутать.
| Источник дубля | Что делать | Комментарий |
|---|---|---|
| UTM и служебные параметры | Оставить canonical на чистый URL, при необходимости редиректить | Если параметр не меняет контент, индексировать его не нужно |
| Сортировки и фильтры | noindex или редирект, если страница не несёт отдельной ценности | Особенно актуально для архивов и каталогов |
| Пагинация архивов | Обычно не закрывать всё подряд, а следить за canonical и качеством внутренних ссылок | Не стоит ломать навигацию ради «чистой» индексации |
| Дубли с www / без www, http / https, слэшем / без слэша | 301-редирект на один вариант | Это уже не SEO-совет, а базовая нормализация URL |
Пошаговое решение: от диагностики к исправлению
Шаг 1. Найдите проблемные URL
Начните с отчётов Search Console и поиска по сайту. Полезно выгрузить список URL с параметрами и посмотреть, какие из них реально получают трафик. Если параметр используется только для сортировки или трекинга, он не должен жить как отдельная индексируемая страница.
Для быстрой проверки можно пройтись по логике URL вручную: откройте страницу, добавьте параметр и посмотрите, меняется ли контент. Если нет — это кандидат на canonical или редирект.
Шаг 2. Нормализуйте базовый адрес
Сначала убедитесь, что сайт отдаёт один канонический вариант домена и протокола. Это делается на уровне сервера или хостинга. В WordPress дополнительно проверьте Настройки > Общие, чтобы адрес сайта и WordPress были одинаковыми по схеме и домену.
Если у вас уже есть редиректы на уровне nginx или Apache, не дублируйте их в нескольких местах без необходимости. Двойная цепочка редиректов часто создаёт лишнюю задержку и усложняет диагностику.
Шаг 3. Закройте параметры, которые не должны индексироваться
Если параметр не меняет смысл страницы, лучше не давать ему отдельную индексацию. Для этого обычно хватает canonical на чистый URL. Но если параметров много и они генерируют мусорные URL массово, удобнее добавить правило на уровне сайта.
Пример: убираем из URL трекинговые параметры и делаем 301-редирект на чистый адрес, если они пришли как единственный хвост.
<?php
add_action('template_redirect', function () {
if (is_admin() || wp_doing_ajax()) {
return;
}
$remove_params = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];
$has_tracking = false;
foreach ($remove_params as $param) {
if (isset($_GET[$param])) {
$has_tracking = true;
break;
}
}
if (!$has_tracking) {
return;
}
$current_url = home_url(add_query_arg([], $GLOBALS['wp']->request));
$clean_url = remove_query_arg($remove_params, $current_url);
if ($clean_url !== $current_url) {
wp_safe_redirect($clean_url, 301);
exit;
}
});Этот пример подходит только для параметров, которые не нужны для функциональности страницы. Не применяйте его к фильтрам, от которых зависит отображение контента, если такие URL должны открываться отдельно.
Шаг 4. Добавьте canonical для страниц с параметрами
Если страница с параметром должна открываться, но не должна конкурировать с основной версией, canonical — правильный первый шаг. В WordPress это можно сделать через фильтры SEO-плагина или через собственный код, если у вас нет плагина, который уже управляет canonical.
Ниже пример для фронтенда: если в URL есть параметр sort, canonical указывает на чистый адрес без него.
<?php
add_filter('get_canonical_url', function ($canonical, $post) {
if (empty($_GET['sort'])) {
return $canonical;
}
return remove_query_arg('sort', $canonical);
}, 10, 2);На практике этот подход удобен, когда сортировка не меняет смысл страницы, а только порядок элементов. Если же параметр создаёт реально отдельную посадочную страницу, canonical может быть неуместен.
Шаг 5. Для служебных архивов используйте noindex, а не полное скрытие
Иногда нужно оставить страницу доступной пользователю, но убрать её из поиска. Это касается, например, архивов с тонким контентом, страниц сортировки или технических фильтров. В таком случае лучше использовать noindex, follow, а не закрывать всё robots.txt, если страница должна передавать внутренний вес по ссылкам.
Если у вас установлен SEO-плагин, настройка обычно делается в интерфейсе. Если нет — можно добавить мета-тег вручную для конкретных шаблонов:
<?php
add_action('wp_head', function () {
if (is_search() || is_tag()) {
echo '<meta name="robots" content="noindex,follow">' . "\n";
}
});Но не разбрасывайте такой код без разбора по всем архивам. Например, теги на хорошем сайте могут быть полезными посадочными страницами, если они заполнены и реально приводят трафик.
Как проверить, что исправление сработало
После внедрения изменений не ограничивайтесь визуальной проверкой в браузере. Нужно убедиться, что поисковый робот видит именно то, что вы задумали.
- откройте URL с параметром и проверьте, есть ли 301-редирект на чистый адрес;
- посмотрите исходный код страницы и убедитесь, что canonical указывает на нужный URL;
- проверьте заголовок
X-Robots-Tag, если вы настраивали его на уровне сервера; - в Search Console отправьте страницу на повторную проверку;
- сравните, исчез ли дубль из отчётов после следующего обхода.
Для быстрой проверки редиректа удобно использовать curl:
curl -I "https://example.com/page/?utm_source=test"В ответе должен быть 301 и заголовок Location с чистым URL. Если вместо этого вы видите 200 OK, значит редирект не сработал или был поставлен не на том уровне.
Частые ошибки и как их исправить
Закрывают всё через robots.txt
Это частая ошибка. Robots.txt не убирает уже проиндексированные URL из поиска и не решает проблему дублей полностью. Если страница уже попала в индекс, нужен canonical, noindex или редирект — в зависимости от сценария.
Ставят canonical на несуществующий или нестабильный URL
Canonical должен вести на реальный, доступный и стабильный адрес. Если он указывает на URL с редиректом, поисковик может проигнорировать его или выбрать другой вариант.
Редиректят все параметры подряд
Это ломает фильтры, сортировки и иногда даже формы. Сначала разделите параметры на служебные и функциональные. Трекинг — можно убирать. Фильтр, который меняет выдачу, — не всегда.
Оставляют дубли в sitemap
Если в карту сайта попадают URL с параметрами или технические архивы, поисковик получает сигнал, что эти страницы важны. Проверьте генератор sitemap и исключите из него лишние шаблоны.
Что делать, если дубли создаёт тема или плагин
Иногда источник проблемы не в настройках WordPress, а в шаблоне или плагине, который генерирует отдельные страницы для фильтров, меток или сортировок. В таком случае сначала проверьте, есть ли у плагина штатные настройки индексации. Если есть — используйте их, а не правьте код вслепую.
Если настройки нет, безопаснее сделать минимальный слой на своей стороне: canonical, noindex для конкретных шаблонов, исключение из sitemap и точечный редирект для мусорных параметров. Это проще сопровождать, чем переписывать логику плагина.
Практические советы по безопасности и производительности
Любой код для редиректов и canonical лучше держать в дочерней теме или в небольшом mu-plugin, а не в файле темы, который может затереться при обновлении. Перед изменениями проверьте сайт на staging-копии.
Если у вас много параметров и фильтров, не пытайтесь решать всё PHP-логикой на каждом запросе без необходимости. Чем меньше условий в template_redirect, тем проще поддержка и ниже риск случайно сломать фронтенд.
Для сайтов, где дубли и служебные страницы уже накопились, полезно сначала навести порядок в индексации, а потом уже заниматься контентом. В таких задачах иногда помогает Clearfy Pro: он закрывает часть типовых дублей и технического мусора без ручного кода, но использовать его стоит только там, где его настройки действительно совпадают с вашей структурой сайта. Подробности можно посмотреть на странице плагина: Clearfy Pro.
Если после правок дубли не исчезают, проверьте не только HTML, но и серверные заголовки, карту сайта и внутренние ссылки. В WordPress проблема редко живёт в одном месте.