Как найти и убрать дубли страниц в WordPress через canonical и переадресации

Дубли страниц в 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, потом индекс.

  1. Откройте старый URL через curl -I и убедитесь, что он отдаёт 301 на нужный адрес.
  2. Проверьте исходный код целевой страницы и найдите корректный canonical.
  3. В Search Console запустите проверку URL и посмотрите, какой адрес выбран каноническим.
  4. Через несколько дней проверьте, не появились ли новые дубли с параметрами или вложениями.

Если редирект работает, а 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, но только как дополнение к нормальной диагностике, а не вместо неё.

Как избежать конфликтов плагинов WordPress: практическое руководство
10.02.2026
Как автоматизировать обновление тем в WordPress
25.11.2025
Как добавить атрибуты ALT и TITLE к картинкам WordPress автоматически
08.01.2026
WooCommerce: как автоматически отключать товары без продаж через код
13.07.2026
Оптимизация базы данных WordPress для повышения скорости сайта
17.11.2025