Дубли метатегов в WordPress обычно всплывают не сразу: сайт индексируется, страницы открываются, но в Search Console появляются одинаковые title и description, а иногда поисковик выбирает не тот canonical. На небольшом сайте это выглядит как косметическая проблема, но на практике дубли мешают нормальной индексации, размывают релевантность и усложняют диагностику SEO-ошибок.
Чаще всего причина не в «плохом SEO», а в технической схеме: тема уже выводит метатеги, SEO-плагин добавляет свои, а часть шаблонов — архивы, таксономии, пагинация, вложения — получает одинаковые шаблонные значения. Ниже разберём, как быстро найти источник дублей и убрать его без лишних плагинов.
Когда проблема действительно есть
Сначала нужно убедиться, что речь именно о дублях метатегов, а не о похожих заголовках страниц. Проверять стоит три вещи:
- title — одинаковый заголовок у разных URL;
- meta description — одинаковое описание на нескольких страницах;
- canonical — у страницы указан не тот основной URL или canonical отсутствует.
Быстрый способ диагностики — открыть несколько типовых URL и посмотреть исходный код страницы. Если на разных страницах одинаковые значения формируются из шаблона, проблема почти всегда в теме или в SEO-плагине, который не отключил встроенные метатеги темы.
Что искать в исходнике
Откройте страницу и проверьте, не выводятся ли метатеги дважды. Типичный признак — два тега <meta name="description"> или два <link rel="canonical">. Ещё один частый сценарий — title формируется и через wp_title, и через add_theme_support( 'title-tag' ), из-за чего в браузере всё выглядит нормально, а в HTML есть конфликт логики.
Откуда берутся дубли метатегов
В WordPress дубли обычно появляются в одном из четырёх мест:
- тема вручную печатает title, description или canonical в
header.php; - SEO-плагин уже добавляет те же теги через
wp_head; - шаблоны архивов и таксономий используют одинаковые fallback-значения;
- вложенные страницы, пагинация и страницы поиска получают один и тот же шаблон метатега.
Если у вас старый шаблон, проверьте, нет ли там прямого вывода <title> и самописного canonical. Если тема современная, но SEO-плагин установлен поверх неё, конфликт чаще всего возникает из-за того, что тема не была адаптирована под плагин.
Пошаговое решение: убрать дубли на уровне темы
Самый надёжный путь — оставить генерацию метатегов одному источнику. Если вы используете SEO-плагин, тема не должна печатать свои title, description и canonical. Если плагина нет, метатеги можно собрать через wp_head аккуратно и без повторов.
Шаг 1. Уберите ручной вывод title из темы
В functions.php темы должен быть включён современный механизм заголовка:
add_action( 'after_setup_theme', function () {
add_theme_support( 'title-tag' );
} );После этого в header.php не нужно выводить <title> вручную. Если он там есть, удалите этот фрагмент. Иначе WordPress и тема будут конкурировать за один и тот же тег.
Шаг 2. Отключите дублирующий description и canonical
Если тема сама добавляет description и canonical, а SEO-плагин уже делает это, оставьте только один источник. Ниже пример, как безопасно убрать самописный вывод из темы, если он завязан на собственные функции:
remove_action( 'wp_head', 'theme_meta_description', 5 );
remove_action( 'wp_head', 'theme_canonical_tag', 10 );Названия функций здесь должны совпадать с реальными функциями темы. Если в теме они называются иначе, ищите их по add_action( 'wp_head', ... ) или по строкам meta name="description" и rel="canonical" в файлах шаблона.
Шаг 3. Сделайте один источник метатегов для архивов
Если SEO-плагина нет, можно вывести description и canonical через wp_head только для нужных типов страниц. Пример ниже не претендует на полноценную SEO-систему, но помогает убрать дубли на типовых архивных страницах:
add_action( 'wp_head', function () {
if ( is_singular() ) {
return;
}
if ( is_search() || is_404() ) {
return;
}
$description = '';
if ( is_category() || is_tag() || is_tax() ) {
$term = get_queried_object();
if ( $term && ! empty( $term->description ) ) {
$description = wp_strip_all_tags( $term->description );
}
}
if ( $description ) {
echo '<meta name="description" content="' . esc_attr( $description ) . '" />' . "\n";
}
if ( is_archive() ) {
echo '<link rel="canonical" href="' . esc_url( get_pagenum_link( 1 ) ) . '" />' . "\n";
}
}, 20 );Здесь важно не пытаться «улучшить SEO» любой ценой. Если у вас уже стоит Yoast SEO, Rank Math или другой SEO-плагин, не дублируйте их логику этим кодом. Используйте его только как временное решение или в проектах без SEO-плагина.
Сравнение подходов
| Подход | Когда подходит | Минус |
|---|---|---|
| Плагин SEO | Нужны шаблоны, canonical, robots и управление архивами | Нельзя параллельно оставлять самописные метатеги в теме |
| Код в теме | Небольшой сайт, нужен контроль без лишних зависимостей | Нужно аккуратно поддерживать логику для архивов и пагинации |
| Смешанный вариант | Переходный период при миграции с одной схемы на другую | Самый рискованный вариант, если не отключить дублирующий вывод |
Проверка результата после внедрения
После правок проверьте не только визуально, но и в HTML. Откройте несколько страниц разных типов:
- обычная запись;
- страница рубрики;
- страница метки;
- страница поиска;
- страница пагинации архива.
В исходнике должен быть один title, один meta name="description" и один link rel="canonical". Если тегов несколько, значит, один из источников вы не отключили.
Дополнительно можно проверить через консоль браузера или командой curl:
curl -s https://example.com/category/news/ | grep -Ei 'title|description|canonical'Если в ответе видно повторяющиеся строки, ищите второй источник в теме, плагине или в коде, который подключается через functions.php.
Частые ошибки и как их исправить
- Оставили
<title>вheader.phpи включилиtitle-tag. Решение: оставить толькоadd_theme_support( 'title-tag' ). - Поставили SEO-плагин, но не убрали старый код темы. Решение: найти все функции, подключённые к
wp_head, и отключить дублирующие. - Используете одинаковый шаблон description для всех архивов. Решение: задавать описание по типу страницы, а не одной строкой на весь сайт.
- Забыли про пагинацию. Решение: проверить страницы
/page/2/,/page/3/и убедиться, что canonical ведёт на корректный URL. - Проверяли только главную страницу. Решение: тестировать минимум 4–5 разных шаблонов, иначе дубли останутся незамеченными.
Безопасность и производительность
Не храните метатеги в произвольных опциях без необходимости и не генерируйте их тяжёлыми запросами на каждом хите. Для архивов достаточно данных, которые уже есть в объекте запроса: get_queried_object(), get_the_title(), get_pagenum_link(). Это быстрее и проще для поддержки.
Если вы редактируете тему на живом сайте, сначала сделайте копию и проверьте изменения в staging-окружении. Ошибка в wp_head легко ломает не только SEO, но и вёрстку, если в коде случайно пропущены кавычки или экранирование.
Для проектов, где нужно не только убрать дубли, но и почистить сайт от лишних SEO-артефактов, удобно сначала пройтись по шаблонам темы и отключить всё лишнее вручную, а уже потом подключать SEO-плагин или оставлять собственную логику. Если нужен более широкий набор инструментов для чистки дублей и технических настроек, можно посмотреть Clearfy Pro: https://wpshop.ru/plugins/clearfy.
Главный принцип здесь простой: один URL — один набор метатегов — один источник правды. Как только это соблюдено, большинство странных SEO-дублей исчезает без сложной магии и без лишних плагинов.