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

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

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

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

  • Массовый импорт контента с ошибками;
  • Конфликты плагинов и тем;
  • Ошибки при клонировании записей;
  • Некорректная работа API или внешних сервисов.

Последствия дубликатов:

  • Падение позиций в поисковой выдаче из-за повторяющегося контента;
  • Увеличение размера базы данных и замедление работы сайта;
  • Путаница для посетителей и администраторов;
  • Сложности с аналитикой и учётом посетителей.

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

Первый шаг — идентифицировать дубликаты. Обычно дубликатами считаются записи с одинаковым заголовком post_title или одинаковым содержимым post_content. Для поиска дубликатов можно использовать SQL-запросы напрямую, но лучше — через WP_Query или собственную функцию для гибкости.

Пример запроса, который возвращает заголовки с количеством повторений:

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

Этот запрос покажет заголовки, которые встречаются более одного раза. Аналогично можно сделать для содержания, но это более ресурсоёмко.

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

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

function wpturbo_remove_duplicate_posts() {
    global $wpdb;
    
    // Получаем дублирующиеся заголовки
    $duplicates = $wpdb->get_results(
        "SELECT post_title, COUNT(*) as count FROM {$wpdb->posts} \
        WHERE post_type = 'post' AND post_status = 'publish' \
        GROUP BY post_title HAVING count > 1"
    );

    foreach ($duplicates as $dup) {
        // Получаем все посты с этим заголовком, сортируем по дате публикации
        $posts = get_posts([
            'title' => $dup->post_title,
            'post_type' => 'post',
            'post_status' => 'publish',
            'orderby' => 'date',
            'order' => 'ASC',
            'numberposts' => -1
        ]);

        // Оставляем первый пост, остальные удаляем
        array_shift($posts); // Удаляем первый из массива — сохраняем

        foreach ($posts as $post) {
            wp_delete_post($post->ID, true); // Удаляем без перемещения в корзину
        }
    }
}

Вы можете вызвать эту функцию вручную или через WP-CLI для массовой очистки. Обязательно сделайте резервную копию базы данных перед выполнением.

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

Если предпочитаете готовые решения, рассмотрите следующие плагины:

  • Remove Duplicate Posts — удобный плагин для обнаружения и удаления дубликатов по заголовкам и содержимому.
  • Clearfy Pro — многофункциональный плагин оптимизации, в том числе с инструментами для чистки базы и удаления дубликатов.

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

Как избежать появления дубликатов в будущем

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

  • Внедрить проверку при импорте контента — сравнивать заголовки и уникальные идентификаторы;
  • Использовать плагины с функцией предотвращения дублирования, например, при клонировании постов;
  • Регулярно чистить базу данных, используя WP-CLI или плагины оптимизации;
  • Настроить уникальные правила валидации для форм ввода контента.

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

function wpturbo_unique_post_title_check($data, $postarr) {
    if ($data['post_type'] === 'post') {
        global $wpdb;
        $exists = $wpdb->get_var($wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND ID != %d AND post_type = 'post' LIMIT 1",
            $data['post_title'],
            $postarr['ID']
        ));
        if ($exists) {
            wp_die('Ошибка: Запись с таким заголовком уже существует. Пожалуйста, измените заголовок.');
        }
    }
    return $data;
}
add_filter('wp_insert_post_data', 'wpturbo_unique_post_title_check', 10, 2);

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

Заключение

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

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

Удаление неиспользуемых вариаций товаров WooCommerce через код
05.06.2026
Как создать автоматический редирект в WordPress без плагинов
25.03.2026
Как сделать оптимальный импорт Excel в WordPress без замедлений
27.02.2026
Как создать динамический список постов с фильтрами в WordPress без плагинов
19.12.2025
Как использовать WPRemark для автоматического модерирования комментариев в WordPress
04.04.2026