Дубли в WordPress обычно появляются не из-за одной ошибки, а из-за набора мелочей: одинаковые записи доступны по разным URL, архивы индексируются вместе с основными страницами, а параметры в адресе создают новые версии контента. В итоге поисковик видит несколько почти одинаковых страниц и сам выбирает, какую считать основной. Это часто бьёт по индексации, распределению ссылочного веса и скорости переобхода сайта.
Ниже — рабочий сценарий: как найти дубли, что именно править в WordPress и как проверить, что проблема действительно ушла. Без выдуманных хуков и без лишней магии.
Как понять, что на сайте есть дубли
Сначала не трогайте код. Сначала проверьте симптомы. Если в Search Console одна и та же страница появляется с разными вариантами URL, если в индексе есть и адрес с /page/2/, и основной архив, если в выдаче всплывают версии с параметрами вроде ?replytocom= или ?utm_, это уже повод разбирать структуру адресов.
Что смотреть в первую очередь
- отчёт по страницам в Google Search Console;
- результаты поиска по
site:example.comи похожим URL; - исходный код страниц на наличие
rel="canonical"; - доступность архивов тегов, авторов, дат и вложений;
- редиректы между версиями с
wwwи безwww, сhttpиhttps.
Если у сайта есть старые записи, проверьте и вложения медиафайлов. WordPress может отдавать отдельную attachment-страницу, которая почти всегда бесполезна для индексации и часто становится дублем.
Какие дубли WordPress создаёт чаще всего
У WordPress типовые источники дублей предсказуемы. Это удобно: их можно закрыть точечно, не ломая сайт.
| Источник дубля | Что обычно происходит | Что делать |
|---|---|---|
| Архивы тегов и рубрик | Одинаковые списки записей доступны через несколько таксономий | Оставить в индексе только нужные архивы, остальные закрыть от индексации или удалить |
| Страницы вложений | Медиафайл имеет отдельную страницу без полезного контента | Редиректить attachment URL на сам файл или родительскую запись |
| Параметры URL | Одна и та же страница доступна с параметрами сортировки, трекинга, комментариев | Нормализовать URL и задавать канонический адрес |
| Пагинация архивов | Страницы /page/2/, /page/3/ индексируются как отдельные сущности | Оставить их доступными, но следить за canonical и качеством пагинации |
Пошаговое решение: как убрать дубли без плагинов
1. Нормализуйте основной адрес сайта
Сначала убедитесь, что сайт открывается только в одном варианте: с https, с одним доменом и одним форматом слэша. Это базовая точка, без неё остальные меры будут частично работать.
Проверьте настройки в Настройки → Общие: WordPress Address (URL) и Site Address (URL) должны совпадать с выбранным каноническим вариантом. Если сайт уже живёт на другом варианте, настройте 301-редирект на уровне сервера.
2. Закройте attachment-страницы редиректом
Если медиафайлы создают отдельные страницы вложений, проще всего отправлять их на сам файл или на родительскую запись. Для большинства проектов безопаснее редиректить на родительскую запись, если она есть, а иначе — на сам файл.
<?php
add_action('template_redirect', function () {
if (!is_attachment()) {
return;
}
$post = get_post();
if (!$post) {
return;
}
$parent_id = $post->post_parent;
if ($parent_id) {
wp_safe_redirect(get_permalink($parent_id), 301);
exit;
}
$file_url = wp_get_attachment_url($post->ID);
if ($file_url) {
wp_safe_redirect($file_url, 301);
exit;
}
});Этот код лучше добавить в дочернюю тему или в небольшой mu-plugin, а не в основной файл темы, если вы часто обновляете шаблон.
3. Уберите индексацию лишних архивов
Если у вас есть теги, которые дублируют рубрики, или архивы автора не несут ценности, их лучше закрыть от индексации. Самый надёжный способ — сделать это через мета-тег robots и не полагаться на визуальное скрытие.
<?php
add_action('wp_head', function () {
if (is_tag() || is_author() || is_date()) {
echo '<meta name="robots" content="noindex,follow">' . "\n";
}
});Но здесь важно не переборщить. Если архив автора у вас реально полезен, например на медиа-сайте или в блоге с несколькими авторами, закрывать его не обязательно. Решение должно исходить из структуры контента, а не из шаблонной рекомендации.
4. Задайте канонический URL для страниц с параметрами
Параметры в URL — частая причина дублей. Если страница доступна как /post/ и /post/?utm_source=..., поисковику нужно явно показать основную версию. WordPress сам ставит canonical для многих шаблонов, но если у вас есть кастомные страницы, фильтры или нестандартные шаблоны, проверьте это вручную.
Для отдельных шаблонов можно вывести canonical самостоятельно:
<?php
add_action('wp_head', function () {
if (!is_singular()) {
return;
}
$canonical = get_permalink();
if ($canonical) {
echo '<link rel="canonical" href="' . esc_url($canonical) . '">' . "\n";
}
}, 1);Если canonical уже выводится темой или SEO-плагином, не дублируйте его. Два одинаковых canonical в одном документе — частая ошибка после ручных правок.
5. Проверьте редиректы для старых и альтернативных URL
Если сайт раньше открывался по другому адресу, старые версии должны уходить на новый 301-редиректом. Это касается и www/non-www, и http/https, и старых путей после смены структуры постоянных ссылок.
На уровне Apache это обычно делается через .htaccess, на Nginx — через конфигурацию сервера. В WordPress не стоит пытаться чинить это только PHP-редиректами, если проблема глобальная: лишний запрос уже будет сделан, а это лишняя нагрузка и задержка.
Как проверить, что решение сработало
Проверка нужна не только в браузере. Смотрите на ответ сервера, canonical и индексируемость.
- Откройте старый URL и убедитесь, что он отдаёт
301, а не302или200. - Проверьте исходный код страницы: canonical должен вести на единственную основную версию.
- Посмотрите, исчезли ли attachment-страницы из внутренней перелинковки.
- В Search Console отправьте на переобход несколько проблемных URL и проверьте, как Google видит канонический адрес.
- Сравните результаты
site:-поиска до и после правок, но не делайте выводы по одному дню — индексация обновляется не мгновенно.
Если у вас есть доступ к командной строке и установлен WP-CLI, полезно быстро проверить, не осталось ли старых ссылок в контенте:
wp search-replace 'http://example.com' 'https://example.com' --dry-run
wp search-replace 'https://www.example.com' 'https://example.com' --dry-run--dry-run здесь обязателен на первом проходе. Он показывает объём замены без записи в базу.
Частые ошибки и как их исправить
Закрыли от индексации всё подряд
Иногда пытаются убрать дубли, ставя noindex на все архивы, категории и даже записи. В результате сайт теряет полезные посадочные страницы. Исправление простое: закрывайте только то, что реально дублирует основной контент или не несёт самостоятельной ценности.
Сделали редирект через JavaScript
Клиентский редирект не решает задачу для поисковика и создаёт лишнюю задержку для пользователя. Для дублей нужен серверный 301.
Оставили несколько canonical одновременно
Это часто случается, когда canonical выводит тема, SEO-плагин и ещё кусок кастомного кода. В таком случае поисковик может проигнорировать часть сигналов. Оставьте один источник canonical и проверьте итоговый HTML.
Удалили архивы, но забыли про внутренние ссылки
Если в меню, хлебных крошках или блоках рекомендаций остались ссылки на старые URL, поисковик и пользователи продолжат ходить по ним. После редиректов проверьте шаблоны, виджеты и контент.
Когда лучше использовать плагин, а когда код
Если сайт небольшой и проблема типовая, кодом можно закрыть attachment-страницы, задать canonical и убрать лишние архивы. Если же у вас десятки шаблонов, сложная таксономия и много старых URL, удобнее использовать специализированный SEO-плагин или инструмент для очистки дублей. Например, в Clearfy Pro есть функции для удаления технического мусора и части дублей, но его стоит подключать только там, где это действительно упрощает поддержку, а не заменяет понимание структуры сайта.
Коротко по выбору:
- Код — когда нужен точечный контроль и минимум зависимостей.
- Плагин — когда важнее быстро закрыть несколько типовых проблем в одном месте.
- Комбинация — когда базовые редиректы делаются на сервере, а мелкие правила — в теме или mu-plugin.
Практика безопасности и производительности
Любые правки, которые влияют на URL, лучше делать с резервной копией базы и списком затронутых адресов. Перед массовыми заменами проверьте, не используются ли старые URL в письмах, внешних интеграциях или рекламных кампаниях.
С точки зрения производительности самый дорогой вариант — пытаться лечить дубли на лету через сложные PHP-условия в каждой загрузке. Если правило можно вынести в серверный редирект или в постоянную настройку темы, так и делайте. Чем меньше логики в wp_head и template_redirect, тем проще сопровождать сайт.
Если после правок дубли всё ещё появляются, не ищите проблему только в WordPress. Иногда источник — в CMS-обвязке, CDN, кэше страницы или в том, как настроены параметры UTM в рекламных ссылках. В таких случаях сначала проверьте, какой именно URL попадает в индекс, а уже потом меняйте код.