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

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

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

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

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

Выявить и своевременно удалить такие записи важно для поддержания качества сайта.

Способы поиска дубликатов в базе данных WordPress

Для начала стоит понять, как определить, что записи являются дубликатами. Обычно дубликаты имеют одинаковые заголовки (post_title) или одинаковое содержимое (post_content). Рассмотрим пример SQL-запроса, который позволяет найти посты с одинаковыми заголовками:

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

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

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

Создание пользовательской функции для удаления дубликатов по заголовку

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

function wptalk_remove_duplicate_posts() {
    global $wpdb;

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

    if (empty($duplicate_titles)) {
        echo 'Дубликаты не найдены.';
        return;
    }

    // Шаг 2: Для каждого дубликата оставляем первую запись, остальные удаляем
    foreach ($duplicate_titles as $title) {
        $posts = get_posts([
            'title' => $title,
            'post_type' => 'post',
            'post_status' => 'publish',
            'orderby' => 'ID',
            'order' => 'ASC',
            'numberposts' => -1
        ]);

        // Оставляем первый пост, остальные удаляем
        $keep = array_shift($posts);
        foreach ($posts as $post) {
            wp_delete_post($post->ID, true); // true — удаляем без возможности восстановления
            echo "Удалён дубликат поста с ID: {$post->ID} и заголовком: {$post->post_title}<br>";
        }
    }
}

Для запуска функции можно добавить вызов wptalk_remove_duplicate_posts(); в файл темы или использовать WP-CLI или плагин для выполнения кода.

Важные замечания

  • Перед удалением обязательно сделайте резервную копию базы данных.
  • Функция удаляет записи без возможности восстановления — будьте внимательны.
  • Если у вас есть пользовательские типы записей или дубликаты по содержимому, функцию нужно доработать.

Как найти и удалить дубликаты по содержимому

Иногда записи могут иметь разные заголовки, но одинаковое содержимое. Для поиска таких дубликатов можно использовать хэширование содержимого. Рассмотрим пример функции, которая ищет записи с одинаковым MD5-хешем содержимого:

function wptalk_remove_duplicate_posts_by_content() {
    global $wpdb;

    $posts = get_posts([
        'post_type' => 'post',
        'post_status' => 'publish',
        'numberposts' => -1
    ]);

    $hashes = [];
    $duplicates = [];

    foreach ($posts as $post) {
        $content_hash = md5($post->post_content);
        if (isset($hashes[$content_hash])) {
            $duplicates[] = $post->ID;
        } else {
            $hashes[$content_hash] = $post->ID;
        }
    }

    if (empty($duplicates)) {
        echo 'Дубликаты по содержимому не найдены.';
        return;
    }

    foreach ($duplicates as $dup_id) {
        wp_delete_post($dup_id, true);
        echo "Удалён дубликат поста с ID: {$dup_id} (по содержимому)<br>";
    }
}

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

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

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

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

Например, плагин Remove Duplicate Posts прост в использовании и поддерживает автоматизацию процессов.

Советы по предотвращению появления дубликатов

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

  • Перед импортом данных проверять уникальность записей;
  • Использовать плагины с функцией контроля дубликатов, например, Clearfy Pro;
  • Ограничить права пользователей, чтобы не допускать случайного копирования;
  • Регулярно проводить аудит базы данных и использовать инструменты оптимизации.

Заключение по теме удаления повторяющихся постов

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

Как установить ограничения на размер загружаемых файлов в WordPress
25.02.2026
Как сделать автоматический импорт из Яндекс Таблиц в WordPress
19.01.2026
Как установить границы пагинации в WordPress для улучшения навигации
01.01.2026
Как создать мультиязычный сайт в WordPress без плагинов
30.11.2025
Как установить бесплатный SSL в WordPress без проблем
15.12.2025