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

Диагностика проблемы пустых и дублирующихся записей в WordPress

Пустые записи и дубли в базе данных WordPress могут возникать по разным причинам: ошибки импорта, сбои плагинов, некорректные автоматические импорты или ручное создание контента. Такие записи негативно влияют на SEO, замедляют работу сайта и усложняют администрирование.

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

  • Посты с пустым содержанием (post_content = '' или NULL)
  • Повторяющиеся записи с одинаковым заголовком и содержанием
  • Повторяющиеся записи с одинаковым slug (post_name)

Пример поиска пустых записей в базе данных

SELECT ID, post_title FROM wp_posts WHERE post_content = '' AND post_type = 'post' AND post_status = 'publish';

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

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

Пошаговое решение удаления пустых и дублирующихся постов через functions.php

Для автоматизации можно написать скрипт на PHP и запустить его один раз через админку или WP-CLI. Ниже пример функции для удаления пустых постов и дубликатов с одинаковым заголовком и содержанием.

function remove_empty_and_duplicate_posts() {
    global $wpdb;

    // Удаляем пустые посты
    $empty_posts = $wpdb->get_col(
        "SELECT ID FROM {$wpdb->posts} WHERE post_content = '' AND post_type = 'post' AND post_status = 'publish'"
    );
    foreach ($empty_posts as $post_id) {
        wp_delete_post($post_id, true);
    }

    // Находим дублирующиеся посты по заголовку и содержанию
    $duplicates = $wpdb->get_results(
        "SELECT post_title, post_content, COUNT(*) as cnt 
         FROM {$wpdb->posts} 
         WHERE post_type = 'post' AND post_status = 'publish' 
         GROUP BY post_title, post_content 
         HAVING cnt > 1"
    );

    foreach ($duplicates as $dup) {
        $posts = $wpdb->get_results($wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND post_content = %s ORDER BY ID ASC",
            $dup->post_title, $dup->post_content
        ));

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

// Запускаем функцию один раз (после выполнения желательно удалить вызов)
remove_empty_and_duplicate_posts();

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

Проверка результата после внедрения

Проверьте, что пустые и дублирующиеся записи удалились следующим образом:

  • Выполните SQL-запросы из раздела диагностики заново — они должны возвращать пустой результат.
  • В панели админки WordPress проверьте раздел «Записи» на наличие пустых или повторяющихся.
  • Проверьте логи сайта и базу данных на наличие ошибок, связанных с удалением.

Частые ошибки и как их исправить

  • Удаление постов не происходит: Возможно, функция не вызывается. Убедитесь, что вызов remove_empty_and_duplicate_posts(); в functions.php активен, и обновляете страницу администратора.
  • Потеря нужного контента: Скрипт удаляет все дубликаты кроме одного, но если контент отличается незначительно, они могут остаться. В таком случае уточните критерии дубликатов.
  • Ошибка базы данных: Проверьте префикс таблиц и корректность SQL-запросов. Используйте $wpdb->prefix для динамического префикса.
  • Функция мешает работе сайта: Удалите вызов функции сразу после первого запуска.

Практические советы по безопасности и производительности

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

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

МетодПлюсыМинусы
Ручные SQL-запросыБыстро, без кодаРиск ошибок, требует доступа к базе
PHP-скрипт в functions.phpАвтоматизация, интеграция с WP APIНужно удалить после выполнения, возможные ошибки без отладки
WP-CLIУдобно для больших сайтов, безопасноТребует SSH-доступа
Как создать собственный тип записи (Custom Post Type) в WordPress
07.02.2026
Как использовать хуки WooCommerce для добавления собственного поля на страницу оплаты
30.05.2026
Как создать автоматический импорт продуктов в WordPress из CSV файла
20.11.2025
Как автоматически удалять старые черновики в WordPress
10.02.2026
Автоматическое отключение неактивных товаров в WooCommerce по дате последней покупки
26.05.2026