Иногда WordPress или SEO-плагин ставит canonical не туда, куда нужно: на страницу пагинации, на фильтр, на служебный шаблон, на дублирующий вариант записи или на страницу, где canonical вообще должен быть отключен. В результате поисковик видит не ту основную версию URL, а это уже влияет на индексацию и консолидацию сигналов.
Ниже разберем не абстрактную теорию, а рабочий сценарий: как точечно убрать или заменить canonical на конкретной странице, не ломая остальной сайт.
Когда canonical действительно мешает
Проблема обычно всплывает после редактирования темы, установки SEO-плагина, включения фильтров в каталоге, создания посадочных страниц с параметрами или при работе с кастомными типами записей. Самый неприятный вариант — когда canonical указывает на URL, который не совпадает с содержимым страницы, а иногда еще и ведет на 404, редирект или другую сущность.
Проверять нужно не только HTML-код страницы, но и то, как canonical формируется в теме и плагинах. В WordPress canonical часто выводится через стандартный механизм ядра, а SEO-плагины могут его переопределять. Поэтому сначала важно понять источник.
Как диагностировать проблему
Откройте исходный код страницы и найдите строку вида <link rel="canonical" href="..." />. Затем проверьте:
- совпадает ли URL с реальной страницей;
- нет ли лишних параметров, если они не должны индексироваться;
- не указывает ли canonical на главную, архив или первую страницу пагинации без причины;
- не дублируется ли тег canonical дважды — от ядра и от SEO-плагина;
- не меняется ли canonical в зависимости от шаблона, языка или состояния авторизации.
Если canonical формируется не там, где вы ожидаете, искать нужно в теме, в functions.php, в mu-plugin или в SEO-плагине. Для диагностики удобно временно отключить плагины по одному на тестовой копии сайта и сравнить исходный код.
Как убрать canonical точечно через фильтр
Если задача касается одной или нескольких страниц, самый надежный путь — не править шаблоны вручную, а использовать фильтр WordPress. Для ядра есть фильтр get_canonical_url, который позволяет изменить canonical перед выводом.
Ниже пример: на конкретной странице canonical отключается полностью. Подходит для служебных страниц, где вы не хотите отдавать поисковику канонический URL.
<?php
add_filter( 'get_canonical_url', function( $canonical, $post ) {
if ( ! $post instanceof WP_Post ) {
return $canonical;
}
// Отключаем canonical только для конкретной записи.
if ( (int) $post->ID === 123 ) {
return false;
}
return $canonical;
}, 10, 2 );Если canonical нужно не убрать, а заменить на другой URL, верните нужный адрес строкой:
<?php
add_filter( 'get_canonical_url', function( $canonical, $post ) {
if ( ! $post instanceof WP_Post ) {
return $canonical;
}
if ( (int) $post->ID === 123 ) {
return home_url( '/landing-page/' );
}
return $canonical;
}, 10, 2 );Этот вариант хорош тем, что не трогает остальной сайт и не зависит от того, какой SEO-плагин установлен. Но если плагин выводит свой canonical отдельно, одного фильтра ядра может быть недостаточно.
Если canonical выводит SEO-плагин
У популярных SEO-плагинов логика может быть своей. В таком случае сначала проверьте настройки конкретного плагина: иногда canonical можно отключить для шаблона, типа записи или отдельной страницы без кода. Если такой опции нет, проще и безопаснее использовать фильтр плагина, а не переписывать шаблон.
Например, у Yoast SEO есть фильтр wpseo_canonical. Его можно использовать для точечной замены:
<?php
add_filter( 'wpseo_canonical', function( $canonical ) {
if ( is_page( 123 ) ) {
return false;
}
if ( is_page( 124 ) ) {
return home_url( '/correct-url/' );
}
return $canonical;
} );Если у вас другой SEO-плагин, логика та же: ищите фильтр, который отвечает именно за canonical, и меняйте значение только на нужных страницах. Не стоит отключать canonical глобально, если проблема локальная.
Сравнение подходов
| Способ | Когда подходит | Минус |
|---|---|---|
| Настройка в SEO-плагине | Если canonical нужно изменить без кода | Не всегда есть нужная опция |
Фильтр get_canonical_url | Если canonical формирует ядро WordPress | Может не перекрыть вывод плагина |
| Фильтр SEO-плагина | Если canonical задает плагин | Нужно знать конкретный хук плагина |
| Правка шаблона | Если нужен полный контроль над head | Легко сломать обновления и дублировать теги |
Пошаговое решение без лишнего риска
- Сначала определите, кто выводит canonical: ядро, тема или SEO-плагин.
- Проверьте исходный код страницы и убедитесь, что проблема воспроизводится стабильно.
- Выберите точечный фильтр, а не глобальное отключение.
- Добавьте код в дочернюю тему или в небольшой mu-plugin, если правка должна переживать обновления.
- Очистите кеш страницы, кеш плагина и, если есть, серверный кеш.
- Снова откройте исходный код и проверьте, что canonical изменился только там, где нужно.
Пример для mu-plugin
Если вы не хотите держать такую логику в теме, создайте файл в wp-content/mu-plugins/canonical-fix.php. Это удобно для точечных технических правок, которые не должны зависеть от активной темы.
<?php
/**
* Plugin Name: Canonical Fix
*/
add_filter( 'get_canonical_url', function( $canonical, $post ) {
if ( $post instanceof WP_Post && (int) $post->ID === 123 ) {
return false;
}
return $canonical;
}, 10, 2 );Как проверить, что решение сработало
Проверка должна быть не на глаз, а по факту. Откройте страницу в браузере и посмотрите исходный код. Затем проверьте:
- в HTML остался ровно один canonical;
- URL canonical соответствует нужной странице или отсутствует, если вы его отключали;
- нет редиректа у canonical-URL;
- страница не дублируется в Search Console как альтернативная версия;
- кеш не возвращает старый вариант кода.
Если canonical меняется в админке, но на фронтенде остается старый, почти всегда виноват кеш. Сначала очищайте кеш плагина и CDN, потом проверяйте снова.
Частые ошибки и как их исправить
Два canonical на одной странице
Обычно это конфликт ядра и SEO-плагина или два разных куска кода в теме. Решение — оставить только один источник генерации canonical. Не пытайтесь «перебить» тег вторым таким же выводом в head.
Отключили canonical глобально
Это плохая идея для обычных страниц, записей и архивов. Без canonical поисковику сложнее понять основную версию URL, особенно если есть параметры, пагинация или UTM-метки.
Код добавили в тему без учета обновлений
Если правка нужна надолго, используйте дочернюю тему или mu-plugin. Иначе после обновления тема может перезаписать изменения.
Проверили только визуально
Страница может выглядеть нормально, но в исходном коде canonical останется старым. Всегда проверяйте HTML, а не только отображение в браузере.
Что учесть по безопасности и производительности
Сам по себе фильтр canonical почти не влияет на производительность, но важно не раздувать functions.php десятками одноразовых правок. Для технических исключений лучше держать отдельный mu-plugin или небольшой плагин проекта. Так проще сопровождать код и меньше риск случайно сломать тему.
Если вы работаете на продакшене, сначала тестируйте правку на копии сайта. Особенно если canonical меняется для страниц, которые уже индексируются: резкие изменения лучше вносить осознанно и после проверки, что нужный URL действительно остается основным.
Если вам нужно не только править canonical, но и чистить дубли, служебные страницы и лишние элементы в head, иногда проще собрать это в один технический набор. Для таких задач уместно посмотреть в сторону Clearfy Pro: https://wpshop.ru/plugins/clearfy?utm_source=wpbusiness.ru&utm_medium=article&utm_campaign=isklyuchit-tekushchuyu-stranitsu-iz-canonical-wordpress
Главная мысль простая: canonical лучше не отключать «на всякий случай». В WordPress почти всегда можно точечно изменить его для конкретной страницы, не затрагивая весь сайт и не создавая новых дублей.