Как удалить дубликаты записей в 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.

Как использовать хуки в WordPress для автоматизации задач
07.11.2025
Как использовать Redis для кэширования в WordPress
01.03.2026
Создать и использовать собственные типы записей в WordPress
30.12.2025
Оптимизация базы данных WordPress: как ускорить сайт и снизить нагрузку
15.11.2025
Как создать собственный плагин WordPress с названием WPFix: пошаговое руководство
26.11.2025