Как убрать дубли страниц WordPress с каноническими URL и 301-редиректами

Дубли в WordPress обычно появляются не из-за одной ошибки, а из-за набора мелочей: одна и та же страница открывается с разными URL, архивы дублируют записи, а пагинация и параметры сортировки создают новые адреса. В результате поисковик видит несколько версий одного и того же контента и выбирает не ту, которую вы хотели бы видеть в индексе.

Ниже — рабочий сценарий: как найти источник дублей, что править в шаблоне и когда ставить 301-редирект, а когда достаточно canonical. Без лишней теории, с проверяемыми шагами.

Как понять, что у вас именно дубли, а не просто много страниц

Сначала проверьте, какие URL реально существуют для одного и того же контента. В WordPress это часто:

  • страница с /page/2/ и без пагинации;
  • URL с ?replytocom=;
  • версии со слешем и без слеша, если сервер и CMS настроены несогласованно;
  • архивы рубрик, тегов и автора, которые повторяют текст записи;
  • страницы с параметрами фильтрации, сортировки или UTM, если они индексируются.

Если в Search Console или в логах обхода вы видите несколько адресов с одинаковым заголовком и одинаковым основным контентом, это уже не «похожая страница», а дубль. Для диагностики удобно сравнить HTTP-ответы и canonical на нескольких URL одной сущности.

Мини-проверка в браузере и через curl

Проверьте, что отдают разные варианты адреса:

curl -I https://example.com/sample-post/
curl -I https://example.com/sample-post/?utm_source=test
curl -I https://example.com/sample-post/page/2/

Смотрите на три вещи: статус ответа, Location при редиректе и наличие Link: <...>; rel="canonical" в HTML-ответе. Если canonical указывает на не тот URL или отсутствует на дубле, поисковик может выбрать произвольную версию.

Что исправлять кодом, а что — настройками

Не все дубли лечатся одинаково. Если адрес должен существовать только в одной версии, ставьте 301-редирект. Если страница нужна для пользователя, но не должна конкурировать с основной, оставляйте её доступной и задавайте canonical на основную версию.

ПодходКогда использоватьКомпромисс
301-редиректДублирующий URL не нужен вообщеПользователь и бот всегда уходят на одну версию
canonicalСтраница нужна, но не должна ранжироваться отдельноДубль остаётся доступным, но сигнал консолидации передаётся поисковику
noindexСтраница нужна в интерфейсе, но не должна попадать в индексЭто не замена редиректу, если URL технически лишний

На практике чаще всего нужен именно 301 для технических дублей и canonical для архивов или страниц с параметрами, если они должны открываться.

Пошаговое решение: убираем дубли на уровне WordPress

1. Приведите канонический URL к одной схеме

Сначала убедитесь, что в Настройки → Общие задан один вариант домена и протокола. Если сайт живёт на HTTPS, не оставляйте старые ссылки на HTTP в шаблоне и базе. Это частая причина цепочек редиректов и дублей.

Дальше проверьте, не генерирует ли тема или плагин ссылки вручную. В шаблонах используйте функции WordPress, а не собранные строкой URL:

<?php echo esc_url( home_url( '/contacts/' ) ); ?>

Для записей и страниц безопаснее использовать get_permalink(), а не хардкодить путь. Тогда при изменении структуры постоянных ссылок вы не получите старые дубли в коде темы.

2. Добавьте 301-редирект для лишних вариантов URL

Если у вас есть конкретные технические адреса, которые не должны жить отдельно, можно закрыть их редиректом в functions.php или в небольшом плагине. Пример для страниц с параметром replytocom и для URL с UTM-параметрами, если они не нужны в индексе:

<?php
add_action( 'template_redirect', function () {
    if ( is_admin() ) {
        return;
    }

    $request_uri = $_SERVER['REQUEST_URI'] ?? '';

    if ( strpos( $request_uri, 'replytocom=' ) !== false ) {
        wp_safe_redirect( remove_query_arg( 'replytocom' ), 301 );
        exit;
    }

    $utm_keys = array( 'utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content' );
    foreach ( $utm_keys as $key ) {
        if ( isset( $_GET[ $key ] ) ) {
            wp_safe_redirect( remove_query_arg( $utm_keys ), 301 );
            exit;
        }
    }
} );

Здесь важно не переборщить: UTM-параметры часто нужны для аналитики, но не для индексации. Если у вас есть отдельные посадочные страницы, которые должны сохранять параметры для скриптов, не редиректите их без проверки.

3. Задайте canonical для архивов и страниц с параметрами

Если архив рубрики или страница фильтра полезна пользователю, но повторяет основной контент, canonical должен указывать на основную страницу. Для этого можно использовать фильтр wpseo_canonical в Yoast SEO или аналогичный механизм в вашей SEO-системе. Если вы не завязаны на плагин, canonical можно вывести в wp_head вручную, но только если вы понимаете, что делаете.

Пример для кастомного canonical на страницах с параметром сортировки:

<?php
add_action( 'wp_head', function () {
    if ( is_admin() ) {
        return;
    }

    if ( isset( $_GET['sort'] ) && is_post_type_archive( 'post' ) ) {
        $canonical = get_post_type_archive_link( 'post' );
        echo '<link rel="canonical" href="' . esc_url( $canonical ) . '" />' . "\n";
    }
}, 1 );

Не ставьте canonical на страницу, которая реально отличается по смыслу и нужна для отдельного поиска. Иначе вы сами обрежете полезную индексацию.

4. Уберите дубли из архивов и таксономий

Если рубрики и теги дублируют друг друга по структуре, проверьте, не выводится ли один и тот же список записей в нескольких местах. Часто проблема не в SEO-плагине, а в шаблоне архива: одинаковые заголовки, одинаковые сниппеты и одинаковая пагинация на разных таксономиях.

Что обычно помогает:

  • оставить индексируемыми только те рубрики, которые реально нужны для поиска;
  • убрать пустые или почти пустые теги;
  • не создавать отдельные архивы ради одного-двух материалов;
  • проверить, не дублируются ли описания таксономий на нескольких страницах.

Если вы используете Clearfy Pro, его имеет смысл рассматривать не как «волшебную кнопку», а как набор точечных настроек для закрытия дублей, чистки лишних архивов и технических страниц. Но перед включением любой автоматической опции лучше сверить, что именно она меняет в шаблоне и мета-тегах.

Как проверить, что решение сработало

После правок не ограничивайтесь открытием страницы в браузере. Проверьте результат на трёх уровнях: ответ сервера, HTML и индексация.

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

Полезно сравнить заголовки до и после:

curl -I https://example.com/sample-post/?replytocom=1

Ожидаемый результат — редирект на чистый URL без параметра. Если вместо этого вы видите 200 OK, значит правило не сработало или его перехватывает другой плагин.

Чек-лист перед публикацией правок

  • основной URL открывается без цепочки редиректов;
  • дублирующие адреса ведут на канонический 301;
  • canonical совпадает с основной версией страницы;
  • в sitemap нет технических URL;
  • архивы, теги и поиск по сайту не создают лишние индексируемые страницы;
  • после очистки кеша страница отдается с актуальными мета-тегами.

Частые ошибки и как их исправить

Редирект ставят на всё подряд

Самая неприятная ошибка — массово редиректить все URL с параметрами. В итоге ломается аналитика, фильтры и иногда даже авторизация. Исправление простое: редиректите только те параметры, которые точно не нужны в рабочем сценарии.

Canonical указывает на несуществующую страницу

Такое бывает после смены структуры ссылок или удаления записи. Поисковик получает сигнал на URL, который уже 404. Проверьте, что canonical ведёт на живую страницу с кодом ответа 200.

Плагин SEO и тема выводят разные canonical

Если canonical печатается и SEO-плагином, и вручную в теме, поисковик может увидеть конфликтующие сигналы. Оставьте только один источник. Обычно это должен быть SEO-плагин или единый шаблонный механизм, но не оба сразу.

Сначала закрывают от индексации, потом пытаются лечить дубли

noindex не решает проблему лишних URL. Если адрес технический, лучше убрать его редиректом. Если страница нужна, но не должна конкурировать, тогда уже думайте о canonical или noindex в зависимости от задачи.

Что делать для безопасности и производительности

Любые правила редиректа и canonical лучше держать в маленьком плагине или в дочерней теме, а не в случайном сниппете из админки. Так проще откатить изменения и не потерять их после обновления темы.

Если сайт большой, не добавляйте тяжёлую логику в template_redirect. Проверка должна быть дешёвой: один-два условия, без запросов к базе и без сложных регулярных выражений на каждый хит. Чем меньше логики в раннем хуке, тем меньше риск просадки на трафике.

И ещё один практический момент: после правок очистите кеш страницы, объектный кеш и CDN, если он есть. Иначе вы можете смотреть на старую версию HTML и думать, что canonical не работает.

Если нужна системная чистка дублей и технических страниц без ручной правки каждого шаблона, имеет смысл смотреть в сторону инструментов, которые умеют управлять SEO-настройками и техническими сигналами централизованно. Но даже тогда базовую проверку через curl и исходный код страницы никто не отменял.

⭐⭐⭐⭐⭐