Как исправить дубли canonical в WordPress и убрать конфликт канонических URL

Если в исходном коде страницы WordPress появляется больше одного тега rel="canonical", поисковик получает противоречивый сигнал. Чаще всего это происходит после установки SEO-плагина, правок темы или когда один и тот же canonical выводится и ядром, и кастомным кодом. В результате страница может индексироваться не так, как вы ожидаете, а в отчётах по сканированию появляются лишние дубли.

Ниже разберём, как быстро найти источник конфликта, убрать лишний canonical и проверить, что на странице остался только один корректный URL.

Как выглядит проблема на практике

Типичный сценарий: вы открываете страницу, смотрите исходный код и видите два похожих тега canonical. Один добавил SEO-плагин, второй — тема через wp_head или кастомный хук. Иногда дубли появляются не как два одинаковых тега, а как разные URL: с www и без, со слэшем и без, с параметрами фильтра или пагинации.

Проблема особенно заметна после миграции сайта, смены темы или переноса настроек SEO-плагина. Если не убрать конфликт, поисковик может выбрать не тот canonical, который вы считаете основным.

Диагностика: где искать лишний canonical

Начните с простого: откройте страницу в браузере и посмотрите исходный код. Ищите строку rel="canonical". Если тегов несколько, дальше нужно понять, кто именно их выводит.

Проверка через исходный код и DevTools

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

Проверка темы и плагинов

Чаще всего canonical добавляют:

  • SEO-плагин;
  • тема в файле header.php или через wp_head;
  • кастомный плагин или сниппет в functions.php;
  • редко — сторонний модуль кеша или оптимизации, который вмешивается в head.

Если у вас есть доступ к файлам, проверьте тему на наличие вызовов вроде rel_canonical() или ручного вывода тега canonical.

<?php
// Плохой пример: ручной canonical в теме, если SEO-плагин уже выводит свой тег.
add_action('wp_head', function () {
    if (is_singular()) {
        echo '<link rel="canonical" href="' . esc_url(get_permalink()) . '" />' . "\n";
    }
}, 1);

Если такой код есть, а SEO-плагин тоже активен, у вас почти наверняка будет дубль.

Пошаговое решение без лишнего риска

Самый безопасный путь — оставить один источник canonical. Обычно это SEO-плагин или ядро WordPress, если вы не используете отдельный SEO-слой. Удалять нужно не всё подряд, а только лишний вывод.

Шаг 1. Найдите источник ручного вывода

Проверьте functions.php, mu-plugins и кастомные плагины. Ищите:

  • rel_canonical();
  • wp_head с <link rel="canonical";
  • фильтры, которые меняют URL canonical;
  • дублирующий код в дочерней теме.

Если canonical выводится вручную, а SEO-плагин уже делает это сам, удалите ручной код. Это самый чистый вариант.

Шаг 2. Если нужен кастомный canonical, отключите стандартный вывод

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

<?php
// Убираем стандартный canonical WordPress.
remove_action('wp_head', 'rel_canonical');

// Добавляем свой canonical только для записей.
add_action('wp_head', function () {
    if (!is_singular()) {
        return;
    }

    $canonical = get_permalink();

    echo '<link rel="canonical" href="' . esc_url($canonical) . '" />' . "\n";
}, 1);

Этот подход подходит только если вы понимаете, почему canonical должен отличаться от стандартного. Для большинства сайтов лучше не усложнять и оставить один источник — SEO-плагин или ядро.

Шаг 3. Проверьте конфликт с SEO-плагином

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

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

Сравнение подходов

ПодходКогда уместенРиск
Оставить canonical от SEO-плагинаОбычные записи, страницы, архивыМинимальный, если нет ручного кода в теме
Отключить стандартный canonical и вывести свойНестандартные шаблоны, особая логика URLМожно ошибиться в формировании адреса
Оставить оба источникаНикогда не стоит так делатьДубли и конфликт сигналов для поиска

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

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

Дополнительно проверьте:

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

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

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

Canonical остался в теме после удаления из functions.php

Иногда код лежит не в functions.php, а в шаблоне header.php или в подключаемом файле темы. Поиск по проекту по строке canonical обычно быстрее, чем ручной просмотр всех файлов.

Плагин и тема спорят между собой

Если canonical выводит и SEO-плагин, и тема, не пытайтесь «подправить» оба источника одновременно. Оставьте один. В большинстве случаев безопаснее убрать ручной вывод из темы.

Неправильный URL в canonical

Бывает, что тег один, но URL в нём ведёт на версию с параметрами, на неканонический домен или на страницу без нужного слэша. Тогда проблема в логике генерации адреса. Проверьте настройки постоянных ссылок, домен сайта в Настройки → Общие и правила редиректов на уровне сервера.

Canonical добавляется только на части страниц

Это часто связано с условиями в коде. Например, разработчик вывел canonical только для is_singular(), но забыл про архивы или страницы пагинации. В таком случае нужно не копировать код наугад, а отдельно определить, какие шаблоны должны иметь canonical и какой именно URL там нужен.

Чек-лист перед публикацией изменений

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

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

Не держите правки canonical в случайных сниппетах без контроля версий. Если сайт рабочий, лучше вынести изменения в дочернюю тему или небольшой mu-plugin, чтобы не потерять их после обновления темы. Перед правкой сделайте резервную копию файлов и базы, особенно если меняете шаблоны, а не только один хук.

Если на сайте агрессивный кеш, после исправления canonical обязательно очистите серверный и плагинный кеш. Иначе вы можете смотреть на старый HTML и думать, что проблема не ушла.

Для сайтов с нестандартной структурой URL полезно один раз зафиксировать правило: кто именно отвечает за canonical — ядро, SEO-плагин или собственный код. Когда источников несколько, дубли появляются почти неизбежно.

⭐⭐⭐⭐⭐