Как удалить дубликаты записей в WordPress

Дубликаты записей в WordPress могут появляться по разным причинам: ошибки импорта, некорректная работа плагинов, сбои при миграциях или дублирование контента пользователями. Они негативно влияют на SEO, замедляют сайт и создают путаницу в админке. В этой статье мы подробно разберём, как обнаружить и удалить дубликаты записей в WordPress, используя как готовые плагины, так и собственные скрипты с примерами кода.

Почему появляются дубликаты постов в WordPress

Чаще всего дубликаты появляются из-за:

  • Ошибок при импорте контента из CSV, XML или других систем;
  • Повторного сохранения записей с одинаковыми заголовками;
  • Сбоев в работе плагинов, которые создают записи автоматически;
  • Некорректной миграции сайта между разными хостингами;
  • Ручного копирования и вставки контента без контроля.

Проблема усугубляется, если на сайте большое количество записей. Ручное удаление дубликатов становится непрактичным, поэтому нужно использовать технические методы.

Как найти дубликаты записей в базе данных WordPress

Для поиска дубликатов удобно использовать SQL-запросы к базе данных. Например, чтобы найти посты с одинаковыми заголовками, выполните следующий запрос через phpMyAdmin или любой другой интерфейс работы с базой данных:

SELECT post_title, COUNT(*) c
FROM wp_posts
WHERE post_type = 'post' AND post_status = 'publish'
GROUP BY post_title
HAVING c > 1;

Этот запрос покажет заголовки, которые встречаются более одного раза среди опубликованных записей.

Для более точного поиска дубликатов можно сравнивать и содержание записей, но это сложнее и требует дополнительных скриптов.

Удаление дубликатов записей с помощью SQL-запроса

После того как вы нашли дубликаты, можно автоматически удалить все кроме одного поста с одинаковым заголовком. Ниже пример запроса, который оставляет самый ранний пост и удаляет остальные:

DELETE p1 FROM wp_posts p1
INNER JOIN wp_posts p2 
ON p1.post_title = p2.post_title 
AND p1.ID > p2.ID
WHERE p1.post_type = 'post' AND p1.post_status = 'publish';

Этот запрос удалит все дубликаты с большими ID, то есть оставит самый первый пост по дате.

Внимание: перед выполнением любых запросов на удаление обязательно создайте резервную копию базы данных.

Автоматизация удаления дубликатов с помощью PHP-функции в WordPress

Если вы хотите интегрировать процесс удаления дубликатов в админку или запускать периодически, можно использовать PHP-функцию. Ниже пример функции wpmax_remove_duplicate_posts(), которая удаляет дубликаты постов с одинаковыми заголовками, оставляя один:

function wpmax_remove_duplicate_posts() {
    global $wpdb;
    
    // Получаем все посты с дубликатами заголовков
    $duplicates = $wpdb->get_results(
        "SELECT post_title, GROUP_CONCAT(ID ORDER BY ID) as ids, COUNT(*) as count_posts
         FROM {$wpdb->posts}
         WHERE post_type = 'post' AND post_status = 'publish'
         GROUP BY post_title
         HAVING count_posts > 1"
    );

    foreach ($duplicates as $dup) {
        $ids = explode(',', $dup->ids);
        // Оставляем первый ID, остальные удаляем
        array_shift($ids);
        foreach ($ids as $delete_id) {
            wp_delete_post($delete_id, true); // true – удаляет без перемещения в корзину
        }
    }
}

// Используйте функцию вручную или привяжите к крону
// wpmax_remove_duplicate_posts();

Эта функция безопаснее, чем прямой SQL-запрос, так как использует WordPress API для удаления, учитывая все связанные данные.

Лучшие плагины для поиска и удаления дубликатов постов

Если вы не хотите писать код, можно воспользоваться готовыми плагинами:

  • Remove Duplicate Posts – бесплатный плагин, который помогает находить и удалять дубликаты по заголовку и контенту.
  • Duplicate Post Cleaner – плагин с расширенными настройками фильтрации дубликатов и массовым удалением.
  • WP Bulk Delete – универсальный инструмент для массового удаления записей по разным условиям, включая дубликаты.

Например, Remove Duplicate Posts прост в использовании и отлично подходит для большинства задач.

Советы по предотвращению появления дубликатов в WordPress

Чтобы минимизировать вероятность появления дубликатов, рекомендуем:

  • Использовать уникальные идентификаторы или мета-поля при импорте контента;
  • Контролировать работу плагинов, которые создают записи автоматически;
  • Добавить проверку на уникальность заголовков при создании поста (можно использовать хуки wpmax_prevent_duplicate_title для этого);
  • Регулярно проводить аудит базы данных и удалять ненужные записи;
  • Резервировать базу данных перед крупными операциями импорта или миграции.

Пример проверки уникальности заголовка при сохранении поста

Для предотвращения сохранения записи с дубликатным заголовком можно использовать такой код:

function wpmax_prevent_duplicate_title( $data , $postarr ) {
    global $wpdb;

    $post_title = $data['post_title'];
    $post_id = isset($postarr['ID']) ? intval($postarr['ID']) : 0;

    $exists = $wpdb->get_var($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND ID != %d AND post_type = %s AND post_status != 'trash'",
        $post_title, $post_id, $data['post_type']
    ));

    if ($exists) {
        // Отменяем сохранение и выводим ошибку
        wp_die('Ошибка: запись с таким заголовком уже существует. Пожалуйста, используйте уникальный заголовок.');
    }

    return $data;
}
add_filter('wp_insert_post_data', 'wpmax_prevent_duplicate_title', 10, 2);

Этот фильтр остановит сохранение записи с дублирующимся заголовком, что значительно снизит количество дубликатов.

WooCommerce: как полностью отключить отмену заказов через личный кабинет
21.05.2026
WooCommerce: как корректно удалить вариации товаров при удалении родительского товара
16.06.2026
Как добавить уникальные поля в WooCommerce без плагинов
23.12.2025
Как установить и изменить PHP разрешения в WordPress без доступа к php.ini
09.02.2026
Как создать динамические таблицы в WordPress с помощью AJAX
21.02.2026