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

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

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

Первый шаг — понять, что именно считается дубликатом. Чаще всего это посты с одинаковым заголовком, содержимым или мета-данными. Иногда дублируются только черновики или записи с одинаковым slug.

Для выявления дубликатов можно использовать SQL-запросы напрямую к базе данных, либо инструменты внутри WordPress.

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

Плагин "Remove Duplicate Posts"

Один из простых решений — плагин Remove Duplicate Posts. Он позволяет искать и удалять дубли через админку.

  • Установка через репозиторий WordPress.
  • Настройка фильтров: по заголовку, дате, автору.
  • Возможность массового удаления или пометки дубликатов.

Это самый быстрый способ, если у вас не очень большой сайт.

Плагин "Duplicate Post Cleaner"

Другой вариант — Duplicate Post Cleaner, который предлагает расширенные фильтры и возможность просмотра дубликатов перед удалением.

Плагин также позволяет экспортировать список дубликатов в CSV для анализа.

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

Если вы хотите контролировать процесс и автоматизировать его, можно написать кастомный скрипт на PHP. Пример функции для wpstudy.ru:

function wpstudy_find_and_delete_duplicates() {
    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 = $wpdb->get_results($wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND post_type = 'post' AND post_status = 'publish' ORDER BY ID ASC",
            $dup->post_title
        ));

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

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

Эта функция ищет посты с одинаковым заголовком и удаляет все, кроме первого по ID.

Важно: перед запуском такого кода делайте полный бэкап базы.

Оптимизация и профилактика появления дубликатов

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

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

Пример проверки уникальности заголовка при сохранении:

function wpstudy_check_unique_title($post_id) {
    if (wp_is_post_revision($post_id)) return;
    $post = get_post($post_id);
    $exists = new WP_Query([
        'post_type' => $post->post_type,
        'post_status' => 'any',
        'title' => $post->post_title,
        'post__not_in' => [$post_id],
    ]);

    if ($exists->found_posts > 0) {
        wp_die('Ошибка: пост с таким заголовком уже существует.');
    }
}
add_action('save_post', 'wpstudy_check_unique_title');

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

Заключение

Удаление дубликатов постов — важный этап поддержания качества сайта на WordPress. Выбор метода зависит от размера сайта и технических навыков. Плагины подходят для быстрого решения, а кастомный код — для гибкой настройки и автоматизации. Регулярный мониторинг и профилактика помогут избежать появления дубликатов в будущем.

Как использовать метаданные для оптимизации WordPress
31.03.2026
Как создать собственный виджет в WordPress с применением PHP и хуков
17.11.2025
Удаление проблем с AJAX-запросами в WordPress: практическое руководство
08.12.2025
Оптимизация загрузки скриптов в WordPress: практические советы и примеры
06.04.2026
WooCommerce: как автоматически удалять неактивные товары через PHP-скрипт
23.05.2026