Дубли страниц в WordPress обычно появляются не из-за одной ошибки, а из-за набора мелочей: разные адреса одной и той же записи, архивы с параметрами, страницы вложений, http/https, www/без www, слэши на конце, пагинация и UTM-параметры. В результате поисковик видит несколько URL с одинаковым или почти одинаковым содержимым и сам выбирает канонический адрес не всегда так, как нужно.
Если задача не в том, чтобы «закрыть от индексации всё лишнее», а в том, чтобы оставить один правильный URL и убрать технические копии, лучше идти по схеме: сначала диагностика, потом canonical и редиректы, затем проверка в обходе сайта и в Search Console.
Какие дубли чаще всего встречаются в WordPress
На живых проектах чаще всего всплывают такие сценарии:
- одна и та же запись доступна по нескольким адресам из-за настроек постоянных ссылок;
- страницы вложений открываются как отдельные URL с тонким или пустым контентом;
- архивы категорий и тегов дублируют друг друга по заголовкам и описаниям;
- URL с параметрами сортировки, фильтрации или трекинга создают новые адреса;
- версия сайта с
wwwи безwwwживёт параллельно; - есть и
http, иhttps, а редирект настроен не везде; - страницы пагинации и архивы автора индексируются без необходимости.
Почему canonical не всегда спасает сам по себе
rel="canonical" подсказывает поисковику предпочтительный адрес, но не убирает сам дубль из обхода. Если копий много, а сервер отдаёт их без редиректа, бот всё равно тратит краулинговый бюджет на лишние URL. Поэтому canonical нужен вместе с 301 там, где адрес должен исчезнуть совсем.
Диагностика: как быстро понять, где именно проблема
Начните не с плагинов, а с проверки реальных адресов. Откройте одну и ту же страницу в нескольких вариантах и посмотрите, что происходит с редиректами и canonical в HTML.
curl -I https://example.com/page-name/
curl -I https://www.example.com/page-name/
curl -I http://example.com/page-name/
Дальше проверьте исходный код страницы. Важно увидеть, какой canonical отдает тема или SEO-плагин:
<link rel="canonical" href="https://example.com/page-name/" />Если canonical указывает на один адрес, а в адресной строке открыт другой, это не всегда ошибка. Но если canonical указывает на параметрический URL, архив или вложение, это уже повод разбираться в шаблоне, плагине или фильтре.
Что смотреть в Google Search Console
В отчёте по страницам и в проверке URL полезно искать такие признаки:
- дубли без выбранной канонической страницы;
- страницы, которые Google считает альтернативными;
- URL с параметрами, попавшие в индекс;
- страницы вложений и архивы, которые не должны ранжироваться отдельно.
Если в Search Console канонический URL отличается от вашего, значит поисковик не доверяет текущей настройке. Тогда нужно не просто добавить тег, а убрать причину дублирования на уровне адресов.
Пошаговое решение: от канонического адреса к редиректам
1. Зафиксируйте один основной формат URL
Сначала выберите, какой вариант должен быть основным: https, с www или без, со слэшем на конце или без него. В WordPress это частично задаётся в Настройки → Общие, но этого недостаточно, если сервер или CDN живёт по своим правилам.
Для большинства сайтов достаточно привести все варианты к одному через 301-редирект на уровне сервера или через template_redirect, если нет доступа к конфигам веб-сервера. Для критичных проектов лучше делать это на сервере, а не в PHP.
2. Уберите дубли вложений
Страницы вложений часто создают тонкие URL без пользы. Если они не нужны как отдельные посадочные, безопаснее редиректить их на родительскую запись или медиафайл.
add_action('template_redirect', function () {
if (!is_attachment()) {
return;
}
$parent_id = wp_get_post_parent_id(get_the_ID());
if ($parent_id) {
wp_safe_redirect(get_permalink($parent_id), 301);
exit;
}
$file_url = wp_get_attachment_url(get_the_ID());
if ($file_url) {
wp_safe_redirect($file_url, 301);
exit;
}
});Этот вариант рабочий, но его нужно тестировать на медиатеке с вложениями, потому что не на каждом сайте родитель у вложения заполнен корректно.
3. Настройте canonical для архивов и параметров
Если дубли появляются из-за параметров сортировки или фильтрации, canonical должен указывать на чистый URL без параметров. В WordPress это можно сделать через фильтр rel_canonical, но только если вы точно понимаете, какие параметры не должны влиять на содержимое страницы.
add_filter('rel_canonical', function ($canonical) {
if (is_admin()) {
return $canonical;
}
if (!empty($_GET['utm_source']) || !empty($_GET['utm_medium']) || !empty($_GET['utm_campaign'])) {
return remove_query_arg(array('utm_source', 'utm_medium', 'utm_campaign'), $canonical);
}
return $canonical;
});Для UTM это уместно, но для фильтров каталога или поиска по сайту такой подход может быть слишком грубым. Там лучше отдельно решать, какие URL должны индексироваться, а какие нет.
4. Сведите редиректы к одному правилу
Если на сайте уже накопилось несколько вариантов одного адреса, не плодите цепочки. Один запрос должен вести в конечную точку напрямую. Иначе вы получите лишнюю задержку и риск петли редиректов.
add_action('template_redirect', function () {
if (is_admin()) {
return;
}
$host = wp_parse_url(home_url(), PHP_URL_HOST);
$scheme = wp_parse_url(home_url(), PHP_URL_SCHEME);
$request_uri = $_SERVER['REQUEST_URI'] ?? '/';
$current = $scheme . '://' . ($_SERVER['HTTP_HOST'] ?? $host) . $request_uri;
$target = home_url(add_query_arg(array(), $request_uri));
if (untrailingslashit($current) !== untrailingslashit($target)) {
wp_safe_redirect($target, 301);
exit;
}
});Этот пример намеренно простой. В реальном проекте лучше ограничить его только нужными сценариями, иначе можно случайно затронуть служебные URL, REST API или страницы предпросмотра.
Сравнение подходов: плагин, код или сервер
| Подход | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
| SEO-плагин | Нужно быстро настроить canonical, noindex, редиректы для типовых архивов | Удобно, меньше кода, проще поддержка | Не всегда решает серверные дубли и может конфликтовать с темой |
| PHP-код в теме или mu-plugin | Нужна точечная логика для вложений, параметров, нестандартных архивов | Гибко, можно точно описать сценарий | Требует тестирования и контроля после обновлений |
| Настройка сервера | Нужно убрать http/www/слэш и цепочки редиректов | Быстро, надёжно, без нагрузки на PHP | Нужен доступ к nginx/apache и аккуратная правка конфигурации |
Если у вас уже стоит плагин для SEO и он корректно ставит canonical, не дублируйте эту логику в теме. Два источника canonical — частая причина странных результатов в индексации.
Чек-лист после внедрения
- один и тот же URL открывается только в одном варианте домена и протокола;
- страницы вложений либо редиректят, либо осознанно оставлены как отдельные;
- canonical на основных страницах указывает на чистый адрес без параметров;
- в Search Console нет массовых альтернативных канонических URL;
- редиректы не создают цепочки из двух и более шагов;
- страницы с UTM не попадают в индекс как отдельные документы;
- в sitemap нет мусорных URL, которые вы не хотите продвигать.
Как проверить, что решение сработало
Проверка должна быть не только визуальной. Сначала смотрим HTTP-ответы, потом HTML, потом индекс.
- Откройте старый URL через
curl -Iи убедитесь, что он отдаёт301на нужный адрес. - Проверьте исходный код целевой страницы и найдите корректный canonical.
- В Search Console запустите проверку URL и посмотрите, какой адрес выбран каноническим.
- Через несколько дней проверьте, не появились ли новые дубли с параметрами или вложениями.
Если редирект работает, а canonical всё ещё указывает на старый адрес, значит проблема осталась в шаблоне, SEO-плагине или фильтре темы.
Частые ошибки и как их исправить
Редирект настроен, но дубли остаются в индексе
Это нормально в краткосрочной перспективе: поисковик не удаляет URL мгновенно. Нужно дождаться повторного обхода и убедиться, что старый адрес отдаёт 301, а не 200.
Canonical указывает на URL с параметрами
Обычно это происходит, когда тема или плагин берёт текущий адрес без очистки query string. Проверьте фильтры canonical и отключите генерацию лишних параметров в ссылках.
Появилась петля редиректов
Чаще всего это конфликт между правилами сервера, плагином редиректов и кодом в теме. Оставьте только один источник логики и тестируйте цепочку на уровне ответа сервера.
Сломались страницы предпросмотра или REST API
Если редирект написан слишком широко и не исключает служебные запросы, он может задеть /wp-json/, предпросмотр записей и административные переходы. Всегда ограничивайте логику условиями is_admin(), wp_doing_ajax() и проверкой конкретных шаблонов.
Практические советы по безопасности и производительности
Не храните редиректы и фильтры canonical в произвольных сниппетах без версии и контроля. Для точечных правок удобнее вынести код в mu-plugin: он не зависит от темы и не пропадёт после смены дизайна.
Если дублей много, сначала уберите их на уровне генерации ссылок и серверных правил, а уже потом добивайте остатки canonical. Так вы снизите нагрузку на обход и уменьшите количество мусорных URL в логах.
Для сайтов, где много технических страниц и архивов, полезно периодически проверять sitemap и шаблоны архивов. Если нужен более широкий набор инструментов для чистки дублей и SEO-настроек, можно посмотреть Clearfy Pro, но только как дополнение к нормальной диагностике, а не вместо неё.