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

Дублированные записи — частая проблема на сайтах WordPress, особенно если контент импортировался из разных источников или при частых миграциях. Они негативно влияют на SEO, создают путаницу у пользователей и засоряют базу данных. Сегодня разберём, как найти и удалить дублированные записи программно, используя собственный PHP-код в functions.php или в плагине.

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

Основных причин несколько:

  • Импорт контента из внешних источников без фильтрации;
  • Ошибки при ручном копировании и вставке;
  • Проблемы с плагинами синхронизации или мультисайтовыми системами;
  • Миграции и резервные копии с неправильной обработкой ID записей.

Понимание причины поможет в профилактике, но сегодня сосредоточимся на решении уже существующих дублей.

Как определить дублированные записи — критерии поиска

Самый простой способ — искать записи с одинаковыми заголовками (post_title) или одинаковым контентом (post_content). Иногда полезно учитывать авторов и дату публикации, чтобы не удалять легитимные записи с похожими названиями.

Кроме того, можно искать дубли по метаданным, если у вас есть уникальные поля, которые должны быть уникальны.

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

Ниже пример простой функции, которая находит дубли по post_title и удаляет все записи, кроме самой первой (по ID). Рекомендуется сначала запускать с комментарием удаления, чтобы проверить, что именно будет удалено.

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

    foreach ($duplicates as $dup) {
        $posts_to_delete = $wpdb->get_col($wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND ID != %d AND post_status = 'publish'",
            $dup->post_title, $dup->first_id
        ));
        foreach ($posts_to_delete as $post_id) {
            // Для проверки можно раскомментировать следующую строку
            // error_log("Удаляем пост с ID: $post_id и заголовком: {$dup->post_title}");
            wp_delete_post($post_id, true); // true — удаление без возможности восстановления
        }
    }
}

// Запускать функцию вручную или подключить к хуку
// wplock_find_and_delete_duplicate_posts();

Эта функция использует стандартный глобальный объект $wpdb для выборки дублированных заголовков и удаления лишних записей.

Важные моменты удаления дублей

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

Автоматизация очистки дублей с WP-CLI

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

if (defined('WP_CLI') && WP_CLI) {
    WP_CLI::add_command('wplock-remove-duplicates', function() {
        global $wpdb;
        $duplicates = $wpdb->get_results(
            "SELECT post_title, COUNT(*) as cnt, MIN(ID) as first_id FROM {$wpdb->posts} 
            WHERE post_type = 'post' AND post_status = 'publish' 
            GROUP BY post_title HAVING cnt > 1"
        );
        $deleted = 0;
        foreach ($duplicates as $dup) {
            $posts_to_delete = $wpdb->get_col($wpdb->prepare(
                "SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND ID != %d AND post_status = 'publish'",
                $dup->post_title, $dup->first_id
            ));
            foreach ($posts_to_delete as $post_id) {
                wp_delete_post($post_id, true);
                $deleted++;
            }
        }
        WP_CLI::success("Удалено {$deleted} дублированных записей.");
    });
}

Такую команду можно запускать из консоли, например: wp wplock-remove-duplicates. Это удобно для регулярной очистки или при подготовке сайта к SEO-аудиту.

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

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

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

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

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

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

  • Настроить уникальные поля с помощью плагинов, например, Advanced Custom Fields, и проверять уникальность при сохранении записи;
  • Использовать хуки WordPress, чтобы перехватывать сохранение записи и проверять дубликаты, например, в save_post;
  • Автоматизировать проверку базы на дубли с помощью WP-CLI или Cron задач с собственными скриптами;
  • Избегать массового импорта без предварительной фильтрации и тестирования.

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

function wplock_check_duplicate_title($post_id) {
    if (wp_is_post_revision($post_id)) {
        return;
    }
    $post_title = get_post_field('post_title', $post_id);
    $args = [
        'post_type' => 'post',
        'post_status' => 'publish',
        'title' => $post_title,
        'posts_per_page' => 1,
        'post__not_in' => [$post_id],
        'fields' => 'ids',
    ];
    $query = new WP_Query($args);
    if ($query->have_posts()) {
        wp_die('Ошибка: запись с таким заголовком уже существует. Пожалуйста, используйте уникальный заголовок.');
    }
}
add_action('save_post', 'wplock_check_duplicate_title');

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

Итог

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

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

Как удалить пустующее изображение в WordPress
02.12.2025
Как отключить комментарии на отдельных страницах WordPress
06.02.2026
Как удалить неактивные комментарии в WordPress: эффективные способы очистки базы
03.02.2026
Как создать свой плагин WordPress с нуля: пошаговое руководство
29.11.2025
Как автоматизировать обновление контента в WordPress с помощью WPRemark
25.01.2026