Дубли в WordPress обычно появляются не из-за одной ошибки, а из-за набора мелких причин: одинаковые записи в нескольких категориях, архивы тегов, пагинация, страницы с параметрами, копии материалов после переноса сайта или публикации через редактор и импорт. Если их не убрать, поисковик начинает выбирать не ту версию страницы, а в админке быстро растёт хаос из похожих материалов.
Ниже — рабочий сценарий: как сначала найти источник дублей, потом безопасно убрать лишнее и проверить, что сайт не потерял нужные URL.
Как понять, что на сайте есть дубли
Проблема не всегда видна глазами. Один и тот же текст может открываться по разным адресам: через архив рубрики, через тег, через страницу автора, через параметры сортировки или через отдельную копию записи. Для пользователя это почти незаметно, а для индексации — уже разные URL.
Типичные признаки
- в Search Console появляются страницы с одинаковым title или description;
- в выдаче индексируются не те URL, которые вы считаете основными;
- одна и та же статья доступна по нескольким адресам без явного редиректа;
- в админке есть записи-клоны после импорта, переноса или ручного копирования;
- архивы таксономий дублируют основной контент почти без изменений.
Что проверить в первую очередь
- откройте запись и посмотрите, нет ли у неё альтернативных URL через категории, теги и архивы автора;
- проверьте исходный код страницы на наличие
rel="canonical"; - сравните заголовки и мета-описания у похожих страниц;
- посмотрите, не создаёт ли плагин SEO отдельные архивы для таксономий, которые вам не нужны;
- проверьте, не остались ли дубли после импорта CSV, миграции или восстановления из бэкапа.
Диагностика: где именно рождается дубль
Перед удалением важно понять источник. Иначе можно снести не копию, а рабочую страницу, которая уже имеет входящий трафик или ссылки.
| Источник дубля | Как выглядит | Что делать |
|---|---|---|
| Записи-клоны | Одинаковый контент в двух post ID | Оставить одну запись, вторую удалить или объединить |
| Архивы категорий и тегов | Почти тот же текст в нескольких архивах | Оставить только полезные архивы, остальные закрыть или убрать |
| Параметры URL | ?utm=, сортировка, фильтры, пагинация | Настроить canonical и, где нужно, noindex |
| Старые версии после миграции | Два одинаковых URL на одном контенте | Сделать 301 на основной адрес |
Если у вас есть доступ к серверным логам или аналитике, посмотрите, какие URL реально получают переходы. Это поможет не удалять страницу, которая всё ещё нужна пользователям.
Пошаговое решение без лишнего риска
Шаг 1. Составьте список подозрительных URL
Начните с выгрузки из Search Console, карты сайта и админки. Сравните записи с одинаковыми заголовками, одинаковыми слагами в разных типах контента и страницы с параметрами. Если сайт небольшой, достаточно ручной проверки. На крупном проекте лучше собрать список в таблицу и отмечать статус каждой страницы.
Шаг 2. Определите, что оставить, а что убрать
Не все похожие страницы — мусор. Иногда у дубля есть внешние ссылки или он уже в индексе. В таком случае безопаснее не удалять его сразу, а поставить 301-редирект на основную страницу. Если же это тестовая копия без трафика, её можно удалить.
Шаг 3. Удалите дублированные записи через админку или код
Если дублей немного, проще удалить их вручную. Если нужно пройтись по списку ID, используйте код с проверкой прав и без жёсткого удаления по умолчанию.
<?php
add_action('admin_post_wplab_delete_duplicate_posts', function () {
if ( ! current_user_can('delete_posts') ) {
wp_die('Недостаточно прав');
}
check_admin_referer('wplab_delete_duplicate_posts');
$ids = isset($_POST['post_ids']) ? (array) $_POST['post_ids'] : [];
$ids = array_map('absint', $ids);
$ids = array_filter($ids);
foreach ($ids as $post_id) {
if ( get_post($post_id) ) {
wp_delete_post($post_id, true);
}
}
wp_safe_redirect(admin_url('edit.php?deleted=1'));
exit;
});Этот вариант подходит только для осознанной чистки. Если есть риск ошибиться, сначала отправляйте записи в корзину, а не удаляйте навсегда.
Шаг 4. Настройте канонический URL
Если одна и та же сущность доступна по нескольким адресам, canonical должен указывать на основную версию. В WordPress это часто делает SEO-плагин, но поведение стоит проверить вручную. Для нестандартных страниц можно задать canonical через фильтр.
<?php
add_filter('wpseo_canonical', function ($canonical) {
if (is_singular('post')) {
return get_permalink();
}
return $canonical;
});Если вы не используете Yoast SEO, не пытайтесь копировать этот код вслепую. У других SEO-плагинов свои фильтры. Суть одна: у страницы должен быть один главный адрес.
Шаг 5. Уберите лишние архивы и страницы-двойники
Часто дубли создают не записи, а служебные страницы: пустые теги, архивы автора на небольшом блоге, страницы поиска, сортировки и фильтрации. Если они не несут пользы, их лучше закрыть от индексации или удалить из карты сайта.
Для архивов, которые не нужны пользователям и поисковику, разумнее использовать noindex и убрать их из sitemap, чем держать их открытыми только ради формального наличия.
Как проверить, что решение сработало
После чистки не ограничивайтесь визуальной проверкой. Нужно убедиться, что основной URL остался доступен, а дубли либо удалены, либо корректно перенаправляются.
- откройте основной URL и убедитесь, что он отдаёт
200 OK; - проверьте старые адреса: они должны отдавать
301на нужную страницу или404, если удаление было осознанным; - посмотрите исходный код страницы и найдите правильный
canonical; - обновите sitemap и проверьте, что в нём нет лишних URL;
- в Search Console отправьте переобход важных страниц и отследите, как меняется статус индексации.
Если у вас включён кеш, очистите его после редиректов и удаления страниц. Иначе вы можете увидеть старую версию и решить, что правило не сработало.
Частые ошибки и как их исправить
Удаляют страницу, не проверив входящие ссылки
Если на дубль ведут внешние ссылки, простое удаление создаст потерю трафика. В таком случае нужен 301-редирект на основную страницу, а не удаление в корзину.
Путают дубль и похожую, но полезную страницу
Например, архив категории и статья-обзор могут быть похожи по теме, но решать разные задачи. Удалять нужно только то, что реально повторяет контент без новой ценности.
Оставляют несколько версий одного URL
Частая ошибка — canonical есть, но старые адреса всё ещё открываются без редиректа. Поисковик может продолжать обходить обе версии. Исправление простое: canonical плюс 301 на основной адрес, если дубль не нужен пользователю.
Чистят базу, не проверяя типы записей
Если удалить записи по ID без фильтра по post type, можно задеть страницы, медиа или кастомные типы записей. Перед массовым удалением всегда ограничивайте выборку по типу контента.
Плагин, код или ручная чистка: что выбрать
Если дублей немного, ручная проверка быстрее и безопаснее. Когда проблема повторяется регулярно, удобнее автоматизировать часть процесса. Для SEO и технической чистки иногда проще использовать специализированный набор инструментов, например Clearfy Pro, если вам нужно закрывать служебные страницы, убирать дубли и наводить порядок в индексации: https://wpshop.ru/plugins/clearfy.
| Подход | Когда подходит | Минус |
|---|---|---|
| Ручная чистка | Мало дублей, понятная структура | Трудно масштабировать |
| Код | Нужно массово удалить или перенаправить | Требует аккуратной проверки |
| Плагин | Нужны регулярные SEO-настройки и контроль дублей | Зависимость от интерфейса и настроек |
Практические советы по безопасности и производительности
- перед массовым удалением сделайте резервную копию базы данных;
- не запускайте чистку на боевом сайте без проверки на staging;
- после удаления дублей обновите sitemap и очистите кеш;
- если используете редиректы, избегайте цепочек из нескольких 301;
- не закрывайте от индексации всё подряд — сначала проверьте, не нужен ли URL пользователям.
Если дубли появляются регулярно, причина обычно не в одном «лишнем посте», а в процессе: импорте, шаблонах архива, настройках SEO-плагина или ручной публикации. Когда источник найден, проблема перестаёт возвращаться.