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

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

Что такое дубликаты записей и почему важно от них избавляться

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

Кроме SEO, дублирование увеличивает нагрузку на сервер и базу данных, усложняет навигацию и мешает аналитике. Поэтому регулярное обнаружение и удаление дубликатов — важная задача для любой CMS, включая WordPress.

Как определить дубликаты в WordPress: критерии поиска

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

  • Идентичный заголовок (post_title)
  • Идентичное содержимое (post_content)
  • Совпадение по метаполям или таксономиям

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

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

Ниже пример функции, которая находит дубликаты записей по заголовку и выводит их ID. Такой подход поможет понять, какие записи необходимо удалить или объединить.

function wpfix_find_duplicate_posts_by_title() {
    global $wpdb;
    $query = "SELECT post_title, GROUP_CONCAT(ID) as ids, COUNT(*) as count
              FROM {$wpdb->posts}
              WHERE post_type = 'post' AND post_status = 'publish'
              GROUP BY post_title
              HAVING count > 1";
    $results = $wpdb->get_results($query);
    foreach ($results as $row) {
        echo 'Дубликат заголовка: ' . esc_html($row->post_title) . ' - записи: ' . esc_html($row->ids) . '<br>';
    }
}

// Вызов функции
wpfix_find_duplicate_posts_by_title();

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

Удаление дубликатов с сохранением одной записи

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

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

function wpfix_delete_duplicate_posts_by_title() {
    global $wpdb;
    $query = "SELECT post_title, GROUP_CONCAT(ID ORDER BY ID) as ids, COUNT(*) as count
              FROM {$wpdb->posts}
              WHERE post_type = 'post' AND post_status = 'publish'
              GROUP BY post_title
              HAVING count > 1";
    $results = $wpdb->get_results($query);
    foreach ($results as $row) {
        $ids = explode(',', $row->ids);
        // Удаляем все дубликаты, кроме первого
        array_shift($ids); // Удаляем первый (оставляем его)
        foreach ($ids as $id) {
            wp_delete_post($id, true); // true - удаление без возможности восстановления
        }
    }
}

// Вызов функции
wpfix_delete_duplicate_posts_by_title();

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

Расширенные методы: сравнение по контенту и метаполям

Если заголовки не всегда уникальны или вы хотите более точный поиск, можно сравнивать хеши содержимого. Например, создадим хеш md5 от post_content и искать записи с одинаковым хешем.

function wpfix_find_duplicates_by_content_hash() {
    global $wpdb;
    $posts = $wpdb->get_results("SELECT ID, post_content FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish'");
    $hashes = [];
    foreach ($posts as $post) {
        $hash = md5($post->post_content);
        if (!isset($hashes[$hash])) {
            $hashes[$hash] = [];
        }
        $hashes[$hash][] = $post->ID;
    }
    foreach ($hashes as $hash => $ids) {
        if (count($ids) > 1) {
            echo 'Дубликаты по содержимому (hash ' . $hash . '): ' . implode(', ', $ids) . '<br>';
        }
    }
}

// Вызов функции
wpfix_find_duplicates_by_content_hash();

Такой подход более точный, но требует больше ресурсов при большом количестве записей.

Использование плагинов для удаления дубликатов

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

  • Remove Duplicate Posts — простой плагин для поиска и удаления дубликатов по заголовку.
  • Duplicate Post Remover — позволяет искать дубликаты по разным параметрам и массово удалять их.
  • WP Optimize — комплексный инструмент, который среди прочего умеет находить и удалять дубликаты.

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

Рекомендации по предотвращению появления дубликатов

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

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

Также полезно настроить WP Cron для периодического запуска скриптов проверки и очистки дубликатов.

Заключение

Удаление дубликатов записей — важный шаг для поддержания здоровья вашего сайта на WordPress. Используйте приведённые примеры кода, чтобы автоматизировать этот процесс и избежать проблем с SEO и производительностью. А если хотите расширенные возможности и удобный интерфейс — рассмотрите плагины.

Подробнее о полезных инструментах для оптимизации WordPress можно узнать на WPSHOP.ru.

Как использовать WPCommunity для создания внутреннего форума на WordPress
23.01.2026
Как использовать WPCommunity для создания команды разработчиков на WordPress
12.03.2026
Как автоматизировать удаление нерабочих ссылок в WordPress
09.01.2026
Как избежать конфликтов между плагинами WordPress
15.03.2026
WooCommerce: создание и использование собственных статусов заказов
04.07.2026