Дубли в WordPress обычно появляются не из-за одной ошибки, а из-за набора мелочей: одна и та же страница доступна с www и без, с http и https, с параметрами ?utm=, через архивы, через вложенные URL, через пагинацию или через отдельные шаблоны темы. В результате поисковик видит несколько адресов с одинаковым контентом и сам выбирает, какой оставить в индексе. Это почти всегда хуже, чем управлять каноникализацией и редиректами вручную.
Как понять, что проблема именно в дублях
Сначала не трогайте код. Проверьте, какие URL реально индексируются и откуда они берутся. Если в поиске всплывают страницы с параметрами, дубли рубрик, версии с /page/2/, вложенные вложения медиафайлов или старые адреса после смены структуры ссылок, это уже рабочий сигнал.
Быстрая диагностика
- Откройте одну и ту же страницу в нескольких вариантах URL: с
wwwи без, со слешем и без, с параметром?utm_source=test. - Посмотрите исходный код и найдите
<link rel="canonical" ...>. - Проверьте ответ сервера для старого URL: должен быть
301, а не200. - В Search Console сравните страницы, которые считаются дубликатами, и страницы, выбранные как канонические.
Если canonical на странице указывает на саму себя, а дубль при этом открывается с кодом 200, поисковик может продолжать индексировать обе версии. Если canonical отсутствует или ведёт не туда, сначала исправляйте шаблон, потом редиректы.
Что выбрать: canonical, 301 или noindex
Это не взаимозаменяемые инструменты. Canonical говорит поисковику, какую версию считать основной. 301-редирект закрывает дубль для пользователя и бота. noindex полезен для страниц, которые не должны попадать в индекс вообще, но он не решает проблему копий, если дубли уже доступны по разным адресам.
| Подход | Когда использовать | Ограничение |
|---|---|---|
| canonical | Параметры, сортировки, пагинация, похожие версии одной страницы | Не убирает дубль из доступа, только подсказывает поисковику |
| 301-редирект | Старые адреса, http→https, www→без www, смена структуры ссылок | Нужно аккуратно исключить циклы и цепочки редиректов |
| noindex | Технические страницы, служебные результаты, отдельные архивы | Не подходит как замена редиректу для старых URL |
Пошаговое решение для WordPress
Ниже схема, которая обычно закрывает большинство бытовых дублей без тяжелых плагинов. Сначала приводим к одному каноническому адресу, потом убираем лишние версии на уровне редиректа, затем проверяем шаблоны темы и SEO-плагина.
1. Настройте единый канонический домен
В Настройки → Общие проверьте, что адрес сайта и WordPress совпадают по протоколу и домену. Если сайт должен жить на https://example.ru, не оставляйте в настройках http://www.example.ru. Это базовая вещь, но именно она часто ломает canonical и генерацию ссылок.
2. Добавьте 301-редирект на один вариант домена
Если сервер Apache, редирект можно сделать через .htaccess. Ниже пример для принудительного перехода на HTTPS и без www:
RewriteEngine On
# Redirect www to non-www and force HTTPS
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.ru$ [NC]
RewriteRule ^ https://example.ru%{REQUEST_URI} [L,R=301]
Для Nginx логика та же, но правило пишется в конфиге сервера. Если у вас уже есть редиректы от хостинга или CDN, не дублируйте их в WordPress, иначе легко получить цепочку из двух-трёх переходов.
3. Приведите canonical к одному шаблону
Если SEO-плагин уже выводит canonical, проверьте, не подменяет ли его тема. В самописных шаблонах иногда вручную добавляют лишний rel="canonical" или, наоборот, забывают его на архивных страницах. Для точечной правки можно использовать фильтр wpseo_canonical, если у вас Yoast SEO, либо rank_math/frontend/canonical для Rank Math. Не смешивайте оба подхода одновременно.
Пример для Yoast SEO: если нужно убрать параметры из canonical на обычных страницах, но оставить саму страницу канонической:
add_filter('wpseo_canonical', function ($canonical) {
if (is_singular()) {
return remove_query_arg(array('utm_source', 'utm_medium', 'utm_campaign', 'ref'), $canonical);
}
return $canonical;
});
4. Закройте параметрические URL от индексации
Если у вас есть страницы, которые открываются с параметрами сортировки, фильтра или меток кампаний, не давайте им становиться отдельными страницами для поиска. В большинстве случаев достаточно canonical на чистый URL. Если параметр создаёт отдельный контентный дубль, лучше делать 301 на основную версию или исключать его на уровне генерации ссылок.
Пример: убрать UTM-параметры из URL при генерации ссылок внутри темы или плагина:
function wpstandart_strip_tracking_params($url) {
return remove_query_arg(
array('utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'ref'),
$url
);
}
add_filter('the_permalink', 'wpstandart_strip_tracking_params');
Этот фильтр не чинит уже открытые внешние ссылки, но помогает не плодить новые дубли внутри сайта.
Когда нужен код, а когда достаточно плагина
Если задача сводится к массовой чистке дублей, проще использовать SEO-плагин или инструмент для технической оптимизации. Если проблема точечная — например, один тип архивов, один параметр или один шаблон темы — код обычно надёжнее и прозрачнее. Для сайтов, где уже есть накопленные дубли, полезно сначала навести порядок в canonical и редиректах, а потом уже чистить шаблоны.
Если нужен более широкий набор инструментов для технической чистки сайта, дублей и SEO-правок, можно смотреть в сторону Clearfy Pro. Но даже в этом случае важно понимать, что именно он должен исправить: canonical, редирект, мета-теги или служебные страницы.
Проверка результата после внедрения
После правок не ограничивайтесь открытием страницы в браузере. Проверка должна быть технической.
- Проверьте код ответа старого URL через
curl -I https://example.ru/old-page/— нужен301. - Откройте итоговую страницу и убедитесь, что canonical указывает на неё саму.
- Проверьте, что URL с параметрами либо редиректит, либо не попадает в индексируемую версию.
- В Search Console отправьте на переобход важные страницы и посмотрите, исчезли ли дубликаты в отчётах.
Пример проверки через командную строку:
curl -I https://example.ru/page/?utm_source=test
curl -I https://www.example.ru/page/
Если в ответе видите 200 там, где ожидали редирект, значит правило не сработало или его перехватывает другой слой: CDN, кеш-плагин, серверный конфиг или тема.
Частые ошибки и как их исправить
Редирект сделан, но canonical остался старым
Так бывает после смены темы или SEO-плагина. Пользователь уже попадает на правильный адрес, но поисковик продолжает видеть старый canonical. Проверьте, не выводит ли его шаблон вручную и не кэшируется ли HTML-страница.
301 превращается в цепочку
Типичный случай: сначала редиректит хостинг, потом WordPress, потом SEO-плагин. В итоге один URL проходит через несколько переходов. Это замедляет обход и иногда ломает аналитику. Оставьте один источник редиректа на каждый сценарий.
Параметры удаляются слишком агрессивно
Не все query string одинаково бесполезны. Если параметр реально меняет контент, например служебный фильтр в каталоге или ID предпросмотра, его нельзя бездумно вырезать из всех URL. Сначала проверьте, влияет ли параметр на содержимое страницы.
Кеш отдаёт старую версию canonical
После правок очистите не только кеш плагина, но и серверный кеш, CDN и, если есть, объектный кеш. Иначе вы будете смотреть на старый HTML и думать, что фильтр не работает.
Практические советы по безопасности и производительности
Редиректы и canonical — это не только SEO, но и нагрузка. Чем меньше лишних переходов и дублей, тем меньше запросов уходит на обход сайта. Но не пытайтесь решать всё через PHP-условия в каждой загрузке страницы, если можно закрыть проблему на уровне сервера.
- Для массовых редиректов используйте серверный уровень, а не тяжелые плагины с таблицами правил.
- Не храните редиректы в нескольких местах одновременно без инвентаризации.
- После изменения правил держите под рукой список старых URL, чтобы не потерять важные входные страницы.
- Если сайт большой, проверяйте редиректы выборочно, а не только вручную в браузере.
Если у вас уже есть SEO-плагин, не дублируйте его функции самописным кодом без необходимости. Лучше один понятный механизм, чем два конкурирующих слоя, которые потом сложно отлаживать.