Дубли метаданных в WordPress обычно всплывают не сразу: сайт открывается, страницы индексируются, но в Search Console появляются одинаковые title и description, а у части URL меняется canonical. На практике это часто происходит после установки SEO-плагина, смены темы, добавления кастомных шаблонов или когда один и тот же метатег выводится и темой, и плагином.
Проблема не в самом факте наличия метатегов, а в том, что поисковик получает несколько конфликтующих вариантов для одной страницы. В итоге снижается предсказуемость индексации, а диагностика превращается в поиск того, кто именно печатает лишний <meta> или <link rel="canonical">.
Как понять, что дубли метаданных уже есть
Сначала стоит проверить не код, а фактический HTML. Откройте проблемную страницу и посмотрите исходник: если в <head> есть два title, два meta name="description" или несколько canonical, это уже не теоретическая ошибка, а конкретный конфликт вывода.
Что искать в исходном коде
- два и более
<title>или разные источники формирования заголовка; - несколько
meta name="description"; - дубли
link rel="canonical"; - одновременно вывод метатегов темой и SEO-плагином;
- разные canonical на версии с параметрами, пагинацией или архивами.
Если нужно быстро проверить страницу из консоли, можно посмотреть фрагмент HTML через curl и отфильтровать head-блок:
curl -L https://example.com/page/ | grep -Ei '<title>|meta name="description"|rel="canonical"'Это не заменяет полноценный аудит, но помогает быстро понять, есть ли дубли вообще и откуда начинать разбор.
Откуда берутся дубли: типовые сценарии
На WordPress дубли метаданных чаще всего появляются в трех местах: тема, SEO-плагин и кастомный код. Если хотя бы два источника пытаются управлять одним и тем же тегом, конфликт почти неизбежен.
| Источник | Что обычно ломает | Что делать |
|---|---|---|
| Тема | Жестко выводит title, description или canonical | Отключить вывод в теме или убрать через дочернюю тему |
| SEO-плагин | Генерирует метатеги поверх шаблона темы | Оставить один источник управления |
| Кастомный код | Добавляет метатеги через wp_head без проверки | Ограничить вывод условиями и приоритетами |
Если сайт старый, часто встречается еще один случай: в теме остался ручной <title>, а WordPress уже использует add_theme_support( 'title-tag' ). Тогда заголовок страницы может дублироваться или формироваться непредсказуемо.
Пошаговое решение: оставляем один источник метаданных
Главный принцип простой: для каждого типа метатега должен быть один ответственный механизм. Либо тема, либо SEO-плагин, либо ваш код. Не все сразу.
Шаг 1. Найдите, кто печатает лишнее
Проверьте functions.php, файлы шаблонов и подключенные плагины. Ищите прямой вывод в wp_head, ручной <title> в header.php и фильтры, которые меняют canonical или description.
Для быстрого поиска по теме и дочерней теме удобно использовать grep:
grep -RniE 'wp_head|canonical|description|<title>|title-tag' wp-content/themes/your-themeЕсли дубли идут из плагина, отключайте его не наугад, а на тестовой копии сайта. Иначе легко перепутать причину и следствие: метатеги исчезнут, но вместе с ними может пропасть и нужная SEO-логика.
Шаг 2. Уберите ручной title из старой темы
Если тема по-прежнему содержит жестко заданный <title>, лучше перевести ее на штатный механизм WordPress. В functions.php дочерней темы добавьте поддержку title-tag, а ручной вывод заголовка из header.php уберите.
add_action( 'after_setup_theme', function () {
add_theme_support( 'title-tag' );
} );После этого WordPress сам будет формировать title через ядро и фильтры, а не через жесткую разметку в шаблоне.
Шаг 3. Оставьте canonical только в одном месте
Если canonical выводит SEO-плагин, не дублируйте его вручную в теме. Если же плагин не используется, canonical можно добавить через wp_head, но только с проверкой контекста страницы.
add_action( 'wp_head', function () {
if ( is_singular() ) {
echo '<link rel="canonical" href="' . esc_url( get_permalink() ) . '" />' . "\n";
}
}, 5 );Приоритет 5 здесь не случайный: если другой код тоже подключен к wp_head, у вас будет шанс вывести canonical раньше или позже, но главное — не дублировать его в нескольких местах.
Шаг 4. Для description используйте фильтр, а не прямой echo
Если description формируется программно, лучше не печатать его напрямую в шаблоне. Надежнее собрать значение в одном фильтре и отдать его туда, где уже ожидается готовая строка. У разных SEO-плагинов фильтры отличаются, поэтому универсального хука для всех случаев нет. Но для собственного кода принцип один: один источник данных, один вывод.
Если вы не используете SEO-плагин, можно собрать description из excerpt или кастомного поля и вывести его через wp_head:
add_action( 'wp_head', function () {
if ( ! is_singular() ) {
return;
}
global $post;
if ( ! $post ) {
return;
}
$description = has_excerpt( $post )
? get_the_excerpt( $post )
: wp_trim_words( wp_strip_all_tags( $post->post_content ), 22, '' );
$description = trim( preg_replace( '/\s+/', ' ', $description ) );
if ( $description !== '' ) {
echo '<meta name="description" content="' . esc_attr( $description ) . '" />' . "\n";
}
}, 10 );Этот вариант годится только если вы точно не выводите description где-то еще. Иначе получите второй дубль.
Как проверить, что решение сработало
После правок не ограничивайтесь визуальной проверкой страницы в браузере. Откройте исходный код и убедитесь, что в <head> остались только нужные теги. Для одной страницы должен быть один title, один meta name="description" и один canonical.
- проверьте исходник страницы вручную;
- сравните HTML до и после правки;
- посмотрите, не меняется ли canonical на страницах пагинации и архивов;
- проверьте мобильную и десктопную версии, если тема подгружает разные шаблоны;
- сделайте повторный обход в Google Search Console после переобхода страниц.
Полезно также проверить, не остались ли старые кэшированные версии. Если у вас включен серверный кэш, CDN или плагин кеширования, очистите их после внесения изменений. Иначе в браузере будет один HTML, а поисковый бот может увидеть другой.
Частые ошибки и как их исправить
Оставили и SEO-плагин, и ручной вывод
Это самая частая причина дублей. Исправление простое: выберите один источник и отключите второй. Если SEO-плагин управляет title, description и canonical, не дублируйте их в теме.
Удалили тег в теме, но забыли про дочернюю тему
Иногда правки делают в родительской теме, а активна дочерняя. В результате ничего не меняется. Проверяйте именно активный шаблон и все подключенные файлы.
Сломали canonical на архивных страницах
Если без условий вывести canonical только через get_permalink(), на архивах и таксономиях он будет неверным. Для таких страниц нужен отдельный сценарий или штатная логика SEO-плагина.
Проверили только главную страницу
На главной все может быть чисто, а на записях, категориях и страницах пагинации — уже дубли. Проверяйте разные типы URL: одиночные записи, архивы, поиск, страницы с параметрами.
Безопасность и производительность: что важно не испортить
Любые правки в wp_head лучше вносить через дочернюю тему или небольшой mu-plugin. Так вы не потеряете изменения после обновления темы. Не редактируйте ядро и не вносите правки в файлы плагина, если хотите сохранить обновляемость.
Если задача шире и кроме дублей нужно почистить сайт от лишних SEO-артефактов, удобно смотреть в сторону инструментов, которые умеют отключать ненужные элементы без ручной правки шаблонов. Например, у Clearfy Pro есть набор функций для технической чистки и управления дублями; это уместно, когда проблема не в одном теге, а в целой группе лишнего вывода. Ссылка на продукт: Clearfy Pro.
Но даже с плагином логику все равно стоит понимать вручную: если не знаете, кто именно выводит метатеги, можно отключить лишнее и случайно сломать нужный canonical или description.
Когда лучше не править кодом
Если сайт уже использует сложную SEO-настройку, мультиязычность или несколько шаблонов для разных типов контента, ручной код может только усложнить поддержку. В таких случаях сначала разберите источник конфликта, а потом решайте, что оставить: тему, плагин или собственный слой метаданных.
Практический критерий простой: если вы не можете за 5 минут ответить, где именно формируется title на конкретной странице, значит сначала нужен аудит, а не новая вставка в functions.php.