Дубли в WordPress обычно появляются не из-за одной ошибки, а из-за набора мелочей: страницы архива доступны с разными параметрами, один и тот же контент открывается по нескольким URL, в индексе остаются версии с ?replytocom, /page/2/, ?amp, http и https. Если это не контролировать, поисковик начинает выбирать не тот адрес, а в отчётах растут «Просканировано, но не проиндексировано» и похожие сигналы.
Как понять, что проблема именно в дублях
Сначала не трогайте код. Проверьте, какие URL реально доступны и какие из них отдают одинаковый контент. Для WordPress это особенно важно на сайтах с архивами, фильтрами, пагинацией и старой темой, где каноникал либо отсутствует, либо формируется неаккуратно.
Признаки, которые стоит проверить вручную
- одна и та же статья открывается с
wwwи безwww; - страница доступна по
httpиhttps; - архив категории имеет дубли с параметрами сортировки или UTM;
- в индексе есть страницы с
/page/2/, хотя они не должны ранжироваться отдельно; - в поиске всплывают адреса с
?replytocomили другими служебными параметрами.
Быстрая диагностика через браузер и Search Console
Откройте проблемный URL и посмотрите исходный код страницы. В <head> должен быть один канонический адрес:
<link rel="canonical" href="https://example.com/sample-post/" />
Если canonical указывает на другой адрес, либо его нет вообще, это уже повод разбирать шаблон темы или плагины SEO/кеширования. В Google Search Console полезно сравнить Проверку URL и фактический канонический URL, который выбрал Google.
Откуда в WordPress берутся дубли
У WordPress есть несколько типовых источников дублей. Ниже — не теория, а то, что чаще всего встречается на живых сайтах.
| Источник | Как выглядит | Что делать |
|---|---|---|
| Два домена или протокола | http://, https://, www, без www |
Сделать один основной вариант и 301-редирект на него |
| Параметры в URL | ?utm_source=, ?replytocom=, сортировка, фильтры |
Закрыть от индексации служебные параметры, оставить canonical на чистый URL |
| Архивы и пагинация | /category/news/page/2/ |
Проверить, нужны ли такие страницы в индексе, и не плодит ли тема лишние архивы |
| Похожие шаблоны | Один пост доступен через рубрику, тег и поиск | Оставить один основной URL, остальные не индексировать |
Пошаговое решение: что исправлять сначала
Лучше идти от уровня сервера и настроек сайта к шаблонам и только потом к мелким исключениям. Так проще понять, где именно появилась проблема.
1. Зафиксируйте основной вариант домена
В Настройки → Общие проверьте адрес WordPress и адрес сайта. Они должны совпадать по протоколу и домену. Если сайт должен жить на https://example.com, не оставляйте там старый http или вариант с www.
Если нужен редирект на уровне сервера, используйте один вариант, а не цепочку из нескольких. Для Apache это обычно делается в .htaccess:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,R=301]
</IfModule>
Для Nginx логика та же, но конфиг будет другим. Важно не смешивать редирект в сервере и редирект в плагине без необходимости: лишняя цепочка ухудшает скорость и усложняет диагностику.
2. Проверьте canonical в теме и SEO-плагине
Если у вас уже стоит SEO-плагин, он обычно сам выводит canonical. Проблема возникает, когда тема тоже добавляет свой тег, и в коде оказывается два canonical. Это нужно исправлять сразу: поисковик не любит дубли мета-тегов.
В кастомной теме canonical лучше не собирать вручную без причины. Если нужно переопределить адрес для конкретного шаблона, делайте это через фильтр, а не через прямую вставку в header.php. Пример для изменения canonical на архиве рубрики:
<?php
add_filter( 'get_canonical_url', function( $canonical, $post ) {
if ( is_category() ) {
$term = get_queried_object();
if ( $term && ! is_wp_error( $term ) ) {
return get_term_link( $term );
}
}
return $canonical;
}, 10, 2 );
Этот подход уместен только если вы понимаете, какой URL должен быть основным. Не подменяйте canonical наугад: если страница реально уникальна, каноникал должен указывать на неё же.
3. Закройте служебные параметры и мусорные URL
Частая ошибка — оставить в индексе адреса с параметрами сортировки, поиска или комментариев. Если такие URL не несут самостоятельной ценности, их нужно либо редиректить, либо помечать как неиндексируемые на уровне шаблона.
Для параметров, которые появляются только в ссылках, можно принудительно убрать их из генерации ссылок в теме или плагине. Например, если нужно убрать replytocom из ссылок комментариев:
<?php
add_filter( 'comment_reply_link', function( $link ) {
return preg_replace( '/([?&])replytocom=\d+(&|$)/', '$1', $link );
} );
Если у вас есть фильтры или поиск с параметрами в URL, лучше отдельно решить, какие из них должны индексироваться, а какие нет. Для неважных вариантов обычно достаточно noindex и корректного canonical на чистую страницу.
Когда достаточно плагина, а когда нужен код
Если задача типовая — один домен, один canonical, базовая чистка дублей — проще использовать SEO-плагин и не дублировать его логику в теме. Но если дубли появляются из-за шаблона, кастомного архива или нестандартного фильтра, без кода не обойтись.
Ниже — практическое сравнение подходов:
| Подход | Плюсы | Минусы |
|---|---|---|
| SEO-плагин | Быстро, удобно для canonical, robots, архивов | Не решает ошибки темы и серверных редиректов |
| Код в теме/мини-плагине | Точечный контроль, можно исправить конкретный шаблон | Нужна аккуратность, легко сломать логику при обновлении |
| Редиректы на сервере | Быстро и надежно для домена и протокола | Не подходит для всех типов дублей |
Как проверить, что исправление сработало
После изменений не ограничивайтесь открытием главной страницы. Проверяйте именно те URL, которые раньше дублировались.
- Откройте старый URL и убедитесь, что он отдает
301на нужный адрес. - Посмотрите исходный код и проверьте, что canonical один.
- Проверьте, что в
<head>нет лишнихmeta robotsи повторяющихся тегов. - В Search Console отправьте на проверку основной URL и сравните выбранный Google canonical.
- Если меняли редиректы, очистите кеш страницы и CDN, иначе будете смотреть на старую версию.
Для быстрой проверки в терминале можно использовать curl:
curl -I https://example.com/old-url/
В ответе должен быть понятный статус: либо 301 Moved Permanently, либо 200 OK для основного адреса. Если видите цепочку из нескольких редиректов, её стоит сократить.
Частые ошибки и как их исправить
Два canonical в одной странице
Обычно это конфликт темы и SEO-плагина. Оставьте только один источник canonical. Если плагин уже выводит тег, уберите дублирующий код из header.php или из подключенного шаблона.
Редирект через 302 вместо 301
Временный редирект не передает сигнал о постоянном переносе адреса. Для смены основного URL нужен именно 301. Иначе поисковик может продолжать держать в индексе старую версию.
Закрыли от индексации не тот URL
Иногда пытаются поставить noindex на основную страницу вместо параметрической версии. Это ошибка: основная страница должна оставаться индексируемой, а мусорный вариант — нет.
Не очистили кеш после правок
Если у вас стоит кеш-плагин или серверный кеш, старый canonical и старые редиректы могут сохраняться. После изменений очистите кеш плагина, серверный кеш и CDN, если он есть.
Сломали пагинацию архивов
Иногда при попытке убрать дубли случайно закрывают все страницы пагинации. Это мешает обходу архива и может ухудшить индексацию важных материалов. Если архив нужен, не режьте его целиком без анализа логов и Search Console.
Что делать для безопасности и производительности
Любые правки редиректов и canonical лучше держать в мини-плагине или в дочерней теме, а не в основной теме, которую вы обновляете. Так меньше шанс потерять изменения после апдейта.
- не ставьте несколько SEO-плагинов одновременно;
- не дублируйте редиректы в плагине и на сервере;
- проверяйте, что правила в
.htaccessне конфликтуют с правилами кеша; - не закрывайте от индексации всё подряд, если проблема только в параметрах URL;
- после правок смотрите логи сервера, если редирект ведет на несуществующий адрес.
Если нужен более системный подход к чистке дублей и технической оптимизации, обычно удобнее опираться на один инструмент, а не собирать набор разрозненных сниппетов. В экосистеме WPShop для таких задач часто используют Clearfy Pro: он закрывает часть типовых технических настроек без ручного вмешательства в шаблоны. Но даже с плагином всё равно нужно проверять фактические URL и код ответа, а не полагаться на галочки в админке.
Мини-чек-лист перед публикацией правок
- основной домен и протокол зафиксированы;
- старые адреса отдают
301на нужный URL; - на странице один canonical;
- служебные параметры не создают индексируемые дубли;
- кеш очищен на всех уровнях;
- основные URL проверены в Search Console.
Если после этого в индексе всё ещё остаются старые варианты, проблема уже не в разовой настройке, а в том, как WordPress генерирует ссылки в теме, плагинах или внешних интеграциях. Тогда имеет смысл идти по списку URL из Search Console и разбирать каждый тип отдельно, а не лечить сайт целиком одним универсальным правилом.