Дубли в WordPress обычно появляются не из-за одной ошибки, а из-за набора мелочей: архивы тегов и рубрик, страницы автора, пагинация, параметры в URL, версии с www и без, HTTP и HTTPS, а иногда — одинаковые записи, доступные по нескольким адресам. Проблема не только в SEO. Когда поисковик видит несколько одинаковых страниц, он тратит обход на лишнее, а в индексе остается не тот URL, который вы хотели бы продвигать.
Ниже — рабочий сценарий: сначала находим источник дублей, потом выбираем способ закрытия или склейки, и в конце проверяем, что всё действительно стало чище.
Как понять, что дубли уже есть
Не стоит начинать с массового удаления. Сначала нужно понять, какие именно URL дублируются и почему. В WordPress чаще всего встречаются такие случаи:
- одна и та же запись открывается с разными хвостами, например
?replytocom=или UTM-параметрами; - страницы архивов доступны в индексации, хотя по смыслу они не нужны;
- у сайта есть версии с
httpиhttps, сwwwи без него; - одинаковый контент доступен через категории, теги и произвольные таксономии;
- пагинация и сортировка создают много похожих страниц.
Проверка начинается с простых вещей. Откройте несколько подозрительных URL и сравните:
- канонический адрес в исходном коде;
- код ответа сервера;
- есть ли редирект на основной URL;
- не индексируется ли страница через
noindexили robots.txt.
Если используете Search Console, смотрите отчеты по страницам с дубликатами и каноническим URL, выбранным Google. Если в индексе всплывают не те адреса, это уже сигнал, что каноникал или редиректы настроены неполно.
Сначала выбираем тип решения: редирект, canonical или noindex
У дублей нет одного универсального лечения. Для разных сценариев подходит разный способ. Удобно ориентироваться так:
| Ситуация | Что делать | Комментарий |
|---|---|---|
| Две версии одного и того же URL | 301-редирект | Лучший вариант для склейки |
| Архив нужен пользователям, но не нужен в поиске | noindex,follow | Не закрывайте в robots.txt, если хотите, чтобы поисковик видел ссылки |
| Похожая страница должна оставаться доступной | rel=canonical | Подходит, когда редирект ломает сценарий |
| Технический параметр в URL | Редирект или очистка параметра | Если параметр не нужен, лучше убрать его на уровне генерации ссылок |
Если речь о настоящем дубле без самостоятельной ценности, обычно нужен редирект. Если страница полезна для навигации, но не должна конкурировать в поиске, лучше использовать canonical или noindex. Закрывать всё подряд через robots.txt — плохая идея: поисковик перестанет обходить страницу, но дубль как сущность никуда не исчезнет.
Пошаговое решение для типовых дублей
1. Приведите сайт к одной основной версии домена
Проверьте, чтобы сайт открывался только в одной комбинации: https и либо с www, либо без него. Это делается на уровне настроек сайта и веб-сервера. В WordPress в Настройки → Общие адреса WordPress Address и Site Address должны совпадать с основной версией.
Если нужен принудительный редирект на уровне WordPress, можно использовать такой код в плагине или functions.php темы:
add_action('template_redirect', function () {
if (is_admin() || wp_doing_ajax()) {
return;
}
$host = $_SERVER['HTTP_HOST'] ?? '';
$uri = $_SERVER['REQUEST_URI'] ?? '/';
$target_host = 'example.ru';
$target_scheme = 'https';
if ($host !== $target_host || !is_ssl()) {
wp_redirect($target_scheme . '://' . $target_host . $uri, 301);
exit;
}
});Этот вариант годится только если вы понимаете, что делаете. На живом сайте лучше сначала проверить редирект в staging-окружении, чтобы не получить петлю перенаправлений.
2. Уберите технические параметры из индексации
Параметры вроде replytocom, utm_* и сортировок часто создают отдельные URL, которые поисковик воспринимает как новые страницы. Если параметр не нужен для контента, его лучше не оставлять в ссылках. Для некоторых случаев достаточно canonical, но если параметр порождает отдельные страницы в большом количестве, редирект надежнее.
Пример: если на сайте есть старые ссылки с ?replytocom, можно перенаправлять их на чистый URL:
add_action('template_redirect', function () {
if (empty($_GET['replytocom'])) {
return;
}
$url = remove_query_arg('replytocom');
wp_safe_redirect($url, 301);
exit;
});Для UTM-параметров такой редирект делать не стоит, если вы используете их в аналитике. В этом случае лучше оставить параметр в адресе, но убедиться, что canonical указывает на чистую страницу без UTM.
3. Закройте архивы, которые не несут ценности
На небольших сайтах часто не нужны страницы автора, теги с одним постом, архивы по датам и часть служебных таксономий. Если они не помогают навигации и не дают трафик, их можно закрыть от индексации. Но важно не путать noindex и запрет в robots.txt.
Для архивных страниц в теме можно добавить мета-тег:
add_action('wp_head', function () {
if (is_author() || is_date() || is_tag()) {
echo '<meta name="robots" content="noindex,follow">' . "\n";
}
});Если используете SEO-плагин, проверьте его настройки архивов. Часто там уже есть переключатели для авторов, дат и тегов. В таком случае код не нужен — дублирование настроек только запутает.
4. Настройте canonical на страницах с похожим контентом
Canonical полезен там, где страница должна существовать, но не должна конкурировать с основной версией. Например, если у вас есть фильтрованная версия каталога материалов или отдельная посадочная под узкий запрос, который почти повторяет базовую страницу.
В шаблоне можно вывести свой canonical, если стандартного недостаточно:
add_action('wp_head', function () {
if (!is_singular()) {
return;
}
$canonical = get_permalink();
echo '<link rel="canonical" href="' . esc_url($canonical) . '" />' . "\n";
}, 1);Но если тема или SEO-плагин уже выводят canonical, не добавляйте второй. Два канонических URL на одной странице — частая ошибка, из-за которой поисковик начинает игнорировать оба.
Диагностика после внедрения
После правок нужно проверить не только главную страницу, но и конкретные проблемные URL. Смотрите на три вещи:
- старый URL отдает
301на нужный адрес; - у целевой страницы один canonical;
- в исходном коде нет лишних дублей мета-тегов и заголовков.
Проверка через curl помогает быстро увидеть, что реально отдает сервер:
curl -I https://example.ru/staryj-url/В ответе должен быть статус 301 Moved Permanently и заголовок Location с новым адресом. Если вместо этого видите 200 OK, редирект не сработал. Если видите цепочку из нескольких редиректов, лучше сократить ее до одного шага.
Дополнительно откройте страницу в браузере и посмотрите исходный код. В нем должен быть один canonical, а не несколько. Для архивов проверьте, что они действительно получили noindex,follow, если это было задумано.
Частые ошибки и как их исправить
- Закрыли страницу в robots.txt вместо noindex. В результате поисковик может продолжать видеть URL как отдельную сущность, но не сможет нормально переосмыслить его статус. Для дублей это обычно не лучший путь.
- Поставили 302 вместо 301. Временный редирект не всегда передает сигнал о постоянной замене. Если URL меняется навсегда, нужен именно 301.
- Добавили canonical на страницу, которая должна редиректить. Canonical — это подсказка, а не жесткое перенаправление. Для явных дублей лучше редирект.
- Оставили несколько версий сайта доступными одновременно. Часто это происходит после миграции:
http,https,wwwи безwwwпродолжают открываться параллельно. - Сломали пагинацию. Если закрыть все архивы без разбора, можно потерять полезные страницы категорий и тегов, которые реально приводят трафик.
Что проверить на производительности и безопасности
Редиректы и проверки в template_redirect не должны превращать сайт в набор тяжелых условий. Не добавляйте сложную логику в functions.php, если можно решить вопрос на уровне сервера или SEO-плагина. Чем меньше PHP-логики на каждом запросе, тем лучше.
Если правите canonical, используйте только проверенные функции экранирования вроде esc_url(). Не подставляйте в HTML сырые значения из $_GET или $_SERVER без очистки. Это уже вопрос безопасности, а не только SEO.
Для сайтов, где много служебных дублей и мусорных архивов, иногда удобнее сначала навести порядок в базе и настройках отображения. В таких задачах помогает, например, Clearfy Pro, если нужен набор инструментов для чистки дублей и технических настроек: https://wpshop.ru/plugins/clearfy. Но даже с плагином важно понимать, что именно он закрывает и почему.
Мини-чек-лист перед публикацией правок
- основной домен открывается только в одной версии;
- старые URL отдают 301 на целевые;
- у целевых страниц один canonical;
- архивы, которые не нужны в поиске, получили
noindex,follow; - в robots.txt нет случайного запрета на важные разделы;
- в Search Console не растет число страниц с дублями после переобхода.
Если после всех правок дубли всё равно появляются, ищите источник не в SEO-настройках, а в генерации ссылок: тема, меню, хлебные крошки, фильтры, виджеты и сторонние плагины часто создают лишние URL незаметно для администратора. В таких случаях проще один раз пройтись по шаблонам и убрать причину, чем бесконечно лечить последствия.