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

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

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

Дубликаты могут возникать по разным причинам:

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

Важно понимать, что дубликаты могут иметь одинаковый заголовок, содержимое или метаполя. В зависимости от задачи, критерии уникальности могут отличаться — например, считать дубликатами записи с одинаковым заголовком или же с полностью совпадающим содержимым.

Поиск дубликатов записей в WordPress по заголовку

Самый простой метод — найти записи с одинаковыми заголовками. Для этого можно использовать SQL-запрос, который вернет заголовки, встречающиеся более одного раза:

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

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

Пример функции для получения ID дубликатов по заголовку

Для автоматизации задачи напишем функцию yarpp_get_duplicate_post_ids(), которая вернет массив ID дублирующихся записей:

function yarpp_get_duplicate_post_ids() {
    global $wpdb;
    $duplicates = $wpdb->get_results(
        "SELECT post_title, GROUP_CONCAT(ID) as ids, COUNT(*) c
         FROM {$wpdb->posts}
         WHERE post_type = 'post' AND post_status = 'publish'
         GROUP BY post_title HAVING c > 1"
    );
    $duplicate_ids = [];
    foreach ($duplicates as $dup) {
        $ids = explode(',', $dup->ids);
        // Оставляем первую запись, остальные считаем дубликатами
        array_shift($ids);
        $duplicate_ids = array_merge($duplicate_ids, $ids);
    }
    return $duplicate_ids;
}

Данная функция собирает ID всех записей с повторяющимся заголовком, кроме первой записи (предполагаемой оригинальной).

Удаление дубликатов программно

После того, как мы получили массив ID дубликатов, можно их удалить программно с помощью функции WordPress wp_delete_post(). Ниже пример функции yarpp_delete_duplicates(), которая выполнит удаление:

function yarpp_delete_duplicates() {
    $duplicate_ids = yarpp_get_duplicate_post_ids();
    foreach ($duplicate_ids as $post_id) {
        wp_delete_post($post_id, true); // true - удаление без помещения в корзину
    }
}
<

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

Как запускать очистку дубликатов

Запускать функцию удаления можно несколькими способами:

  • Добавить вызов yarpp_delete_duplicates() в файл functions.php вашей темы и один раз загрузить страницу сайта.
  • Создать отдельный плагин с данной функцией и запускать через админку.
  • Использовать WP-CLI для выполнения кода из командной строки.

Важно после выполнения удалить или закомментировать вызов функции, чтобы не произошло повторного удаления.

Поиск дубликатов по содержимому записи

Иногда заголовки могут быть разными, а вот содержимое совпадать. Для поиска таких дубликатов нужно сравнивать поле post_content. Это более ресурсоемкая задача, но ее можно реализовать с помощью PHP:

function yarpp_find_content_duplicates() {
    global $wpdb;
    $posts = $wpdb->get_results("SELECT ID, post_content FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish'");
    $hashes = [];
    $duplicates = [];
    foreach ($posts as $post) {
        $hash = md5($post->post_content);
        if (isset($hashes[$hash])) {
            $duplicates[] = $post->ID;
        } else {
            $hashes[$hash] = $post->ID;
        }
    }
    return $duplicates;
}

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

Полезные плагины для работы с дубликатами записей

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

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

Однако любые автоматические решения требуют осторожности и предварительного резервного копирования.

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

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

  • Проверяйте импортируемые данные на уникальность перед загрузкой.
  • Настраивайте плагины, которые создают записи, чтобы исключить повторное добавление.
  • Используйте уникальные идентификаторы (например, метаполя) для контроля.
  • Регулярно проверяйте базу данных на наличие дубликатов и очищайте её.

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как удалить дубликаты записей в WordPress с помощью кода
09.12.2025
Как создать собственный фильтр для YARPP в WordPress: практическое руководство
30.01.2026
Как удалить старые и неиспользуемые мета данные в WordPress для оптимизации базы данных
09.03.2026
WooCommerce: как исключить товары по метаданным из списка связанных товаров
09.06.2026
Как эффективно использовать YARPP для подбора связанных записей по произвольным методам
15.04.2026
×
Оптимизируй свой сайт!

Скидка -15% на премиум плагин Clearfy Pro

Купить плагин сейчас ⋙