Дубли в WordPress обычно появляются не из-за одной ошибки, а из-за набора мелких вещей: пагинация, параметры в URL, архивы тегов, страницы авторов, версии с www и без, HTTP и HTTPS, а иногда — из-за темы или плагина, который выводит один и тот же контент по нескольким адресам. Если это не контролировать, поисковик сам выберет «главный» URL, и не факт, что выберет правильно.
Ниже — рабочая схема: как найти дубли, где ставить канонический адрес, что можно закрыть на уровне шаблонов, а что лучше решать редиректом. Без лишней теории, только то, что реально помогает в WordPress-проекте.
Когда проблема уже есть: как понять, что у вас дубли
Сначала не трогайте код. Проверьте симптомы. Обычно дубли видны в Search Console, в логах обхода или просто в выдаче, когда одна и та же страница открывается по нескольким адресам.
Что искать в первую очередь
- одинаковые заголовки и описания у разных URL;
- страницы с параметрами
?replytocom=,?utm_,?amp,?orderby=и похожими; - архивы рубрик, тегов и авторов, которые повторяют контент записей;
- страницы пагинации, где канонический URL указывает не туда;
- доступность сайта одновременно по
http/httpsили сwww/non-www.
Если у вас включён SEO-плагин, посмотрите, не генерирует ли он canonical автоматически. Частая ошибка — думать, что раз плагин установлен, проблема уже решена. На практике он может ставить канонический URL, но при этом тема или другой плагин добавляет второй тег, и в итоге в HTML появляется конфликт.
Диагностика: где именно рождается дубль
Удобнее всего идти от простого к сложному. Сначала проверяем сам URL, потом шаблон, потом плагины.
Проверка HTML-страницы
Откройте исходный код страницы и найдите тег rel="canonical". На странице должен быть один такой тег, и он должен указывать на основной адрес без лишних параметров.
<link rel="canonical" href="https://example.com/primer-stranicy/" />Если canonical отсутствует, это уже повод смотреть тему и SEO-плагин. Если их два — нужно убрать лишний источник генерации.
Проверка через WP-CLI и базовые запросы
Если есть доступ к консоли, быстро проверьте, не плодятся ли записи с одинаковым slug или не создаются ли лишние страницы редиректов. Самый полезный минимум — посмотреть, как WordPress хранит ссылки и какие шаблоны отдают архивы.
wp post list --post_type=page --fields=ID পোস্ট_title,post_name,post_statusКоманда выше не идеальна для всех окружений, но смысл простой: найти страницы с похожими slug и проверить, не создаёт ли кто-то дубли вручную. На боевом сайте удобнее использовать поиск по базе или экспорт URL из Search Console.
Как убрать дубли: рабочая схема без ломки сайта
Лучший порядок действий такой: сначала настраиваем канонический URL, потом убираем технические дубли редиректами, затем чистим шаблоны архивов и служебных страниц. Не наоборот.
1. Настройте canonical для основных типов страниц
Если тема не делает это корректно, можно добавить свой canonical через wp_head. Но делать это стоит только если вы понимаете, что именно выводит текущая тема и SEO-плагин. Иначе получите двойной тег.
add_action('wp_head', function () {
if (is_singular()) {
global $post;
if (! $post instanceof WP_Post) {
return;
}
$canonical = get_permalink($post);
echo '<link rel="canonical" href="' . esc_url($canonical) . '" />' . "\n";
}
}, 1);Этот вариант годится как страховка, если у вас кастомная тема и вы точно знаете, что больше canonical нигде не выводится. В обычном проекте лучше сначала проверить SEO-плагин и тему, а не добавлять ещё один источник.
2. Уберите параметры, которые не должны индексироваться
Если страницы доступны с мусорными параметрами, поисковик может воспринимать их как отдельные URL. Для некоторых параметров лучше не canonical, а редирект на чистый адрес. Например, для replytocom или лишних UTM на внутренних ссылках.
add_action('template_redirect', function () {
if (is_admin()) {
return;
}
if (isset($_GET['replytocom']) && is_singular()) {
wp_safe_redirect(get_permalink(), 301);
exit;
}
});Это не универсальное решение для всех параметров, но для комментариев и похожих технических хвостов оно работает предсказуемо.
3. Приведите архивы к понятной логике
Архивы рубрик и тегов часто дублируют друг друга или повторяют содержание записей. Если архив не несёт самостоятельной ценности, его лучше не индексировать. Если ценность есть — оставляйте, но следите за уникальными заголовками, описаниями и canonical.
Для архивов можно управлять мета-robots через SEO-плагин или шаблон темы. Если плагина нет, проще и безопаснее использовать готовое решение уровня Clearfy Pro, если задача шире, чем один canonical: там обычно закрывают и дубли, и часть служебных страниц, и мусорные архивы. Но даже в этом случае нужно отдельно проверить, что именно плагин меняет в HTML.
Сравнение подходов: canonical, редирект или noindex
| Подход | Когда применять | Плюс | Минус |
|---|---|---|---|
| canonical | Есть несколько URL с одним контентом | Сохраняет доступность страницы | Не убирает дубль мгновенно |
| 301-редирект | Ненужный технический URL | Жёстко склеивает адреса | Нужно аккуратно проверить цепочки |
| noindex | Архив полезен пользователю, но не нужен в индексе | Не ломает навигацию | Не решает проблему одинаковых URL |
Если коротко: canonical — для выбора основного адреса, редирект — для удаления лишнего адреса, noindex — для страниц, которые должны открываться, но не участвовать в поиске.
Пошаговая настройка на живом сайте
- Составьте список URL с одинаковым контентом: Search Console, краулер, ручная проверка.
- Проверьте, кто выводит canonical: тема, SEO-плагин, кастомный код.
- Оставьте только один источник canonical.
- Технические параметры и старые адреса переведите на 301-редирект.
- Архивы, которые не нужны в поиске, закройте через noindex, а не через robots.txt.
- После правок проверьте исходный HTML и ответ сервера.
Как проверить, что решение сработало
Проверка должна быть не «страница открывается», а «страница открывается правильно». Смотрите на три вещи: код ответа, canonical и отсутствие дублей в обходе.
- основной URL отдаёт
200 OK; - старый или лишний URL отдаёт
301на нужный адрес; - в HTML один canonical, и он совпадает с основным URL;
- в Search Console уменьшается число страниц с пометкой о дублированном контенте;
- в краулере нет цепочек редиректов и циклов.
Проверить ответ сервера можно обычным curl:
curl -I https://example.com/old-url/Если редирект настроен правильно, вы увидите 301 и заголовок Location с новым адресом. Для canonical достаточно посмотреть исходник страницы или использовать браузерный просмотр HTML.
Частые ошибки и как их исправить
Два canonical на одной странице
Обычно это конфликт темы и SEO-плагина. Оставьте один источник. Если плагин уже умеет выводить canonical, не добавляйте второй через wp_head.
Редирект на главную вместо нужной страницы
Так бывает, когда в коде используют слишком общий шаблон. Редирект должен вести на конкретный канонический URL, а не на домашнюю страницу «на всякий случай».
Noindex вместо редиректа для технического дубля
Если URL не нужен вообще, noindex — слабое решение. Поисковик ещё какое-то время будет видеть и обходить этот адрес. Для явного дубля лучше 301.
Закрыли дубли в robots.txt и думают, что вопрос решён
Robots.txt не убирает уже известные поисковику URL из индекса. Он только ограничивает обход. Если адрес уже попал в поиск, нужен canonical, noindex или редирект — в зависимости от сценария.
Что важно для безопасности и производительности
Не вешайте тяжёлую логику на каждый запрос в template_redirect или wp_head. Проверки должны быть короткими и предсказуемыми. Если вы сравниваете URL или параметры, делайте это без лишних запросов к базе.
Ещё один практический момент: не храните список исключений в коде, если он часто меняется. Для больших сайтов лучше вынести правила в конфиг плагина или в отдельный mu-plugin, чтобы не править тему при каждом изменении.
Если в проекте уже есть несколько SEO- и технических плагинов, сначала проверьте конфликты. Два плагина, которые одновременно управляют canonical, robots и редиректами, почти всегда создают побочные эффекты.
Для сайтов, где кроме дублей нужно ещё чистить служебные страницы, архивы и технические хвосты, удобнее использовать один инструмент, чем набор разрозненных сниппетов. Но даже в этом случае проверка после внедрения обязательна: WordPress легко «прощает» лишний код до первого конфликта с темой или обновлением плагина.