wpmoney.ru wordpress WP Money

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

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

Почему важно удалять дубликаты постов в WordPress

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

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

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

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

Для начала стоит определить, по каким признакам считать записи дубликатами. Например, чаще всего достаточно проверить совпадение заголовков и типов записей. Если заголовок полностью совпадает, а дата публикации близка — это почти наверняка дубликат.

Для поиска можно использовать SQL-запросы напрямую к базе данных или WP_Query с последующей фильтрацией в PHP.

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

Запрос ниже выявляет заголовки постов, которые встречаются более чем один раз:

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

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

Автоматическое удаление дубликатов с помощью PHP-кода

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

Ниже пример функции, которую можно добавить в файл functions.php вашей темы или создать отдельный плагин:

function wpmoney_delete_duplicate_posts() {
    global $wpdb;

    // Получаем заголовки дубликатов
    $duplicates = $wpdb->get_col(
        "SELECT post_title FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' GROUP BY post_title HAVING COUNT(*) > 1"
    );

    foreach ($duplicates as $title) {
        // Получаем все посты с этим заголовком, отсортированные по дате (оставим самый старый)
        $posts = $wpdb->get_results($wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND post_type = 'post' AND post_status = 'publish' ORDER BY post_date ASC",
            $title
        ));

        // Оставляем первый пост, остальные удаляем
        if (count($posts) > 1) {
            array_shift($posts); // удаляем первый элемент из массива
            foreach ($posts as $post) {
                wp_delete_post($post->ID, true); // true - чтобы удалить без перемещения в корзину
            }
        }
    }
}

// Запуск функции один раз (например, по хуку admin_init)
add_action('admin_init', 'wpmoney_delete_duplicate_posts');

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

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

Удаление дубликатов — лишь часть решения. Чтобы не допускать их появления, нужно:

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

Для автоматической проверки при сохранении записи можно использовать фильтр wp_insert_post_data:

function wpmoney_check_duplicate_title($data, $postarr) {
    if ($data['post_type'] === 'post' && $data['post_status'] === 'publish') {
        global $wpdb;
        $exists = $wpdb->get_var($wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND post_type = 'post' AND ID != %d LIMIT 1",
            $data['post_title'],
            $postarr['ID'] ?? 0
        ));

        if ($exists) {
            wp_die('Ошибка: Запись с таким заголовком уже существует. Пожалуйста, выберите другой заголовок.');
        }
    }
    return $data;
}
add_filter('wp_insert_post_data', 'wpmoney_check_duplicate_title', 10, 2);

Этот код остановит публикацию записи с дублирующимся заголовком и выведет ошибку.

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

Если вы предпочитаете готовые решения, есть несколько плагинов, которые помогут обнаружить и удалить дубликаты:

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

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

Заключение

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

×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше