wpinc.ru wordpress WP Inc

Автоматическое удаление старых черновиков записей в WordPress

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

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

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

  • Увеличивается размер базы данных, что влияет на скорость резервного копирования и работу сайта.
  • Административная панель становится менее удобной — сложно ориентироваться в списке записей.
  • Если используется плагин для экспорта или анализа контента, черновики могут мешать.

Удаление старых черновиков помогает поддерживать порядок и улучшает производительность.

Автоматизация удаления: как это сделать через код

Для автоматического удаления черновиков, старше, например, 30 дней, можно написать функцию, которая будет запускаться по расписанию с помощью WP-Cron.

Создание функции удаления старых черновиков

Вот пример функции, которую мы назовём wpinc_delete_old_drafts. Она удалит все черновики, созданные более 30 дней назад:

function wpinc_delete_old_drafts() {
    global $wpdb;

    $days = 30; // количество дней
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    // Получаем ID черновиков старше $days дней
    $draft_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_status = 'draft' AND post_type = 'post' AND post_date < %s",
        $date_threshold
    ));

    if (!empty($draft_ids)) {
        foreach ($draft_ids as $id) {
            wp_delete_post($id, true); // true - удалять без возможности восстановления
        }
    }
}

Запуск функции с помощью WP-Cron

Чтобы функция выполнялась автоматически, добавим задание в расписание WordPress. Для этого добавим планировщик и событие:

function wpinc_schedule_delete_old_drafts() {
    if (!wp_next_scheduled('wpinc_daily_delete_old_drafts')) {
        wp_schedule_event(time(), 'daily', 'wpinc_daily_delete_old_drafts');
    }
}
add_action('wp', 'wpinc_schedule_delete_old_drafts');

add_action('wpinc_daily_delete_old_drafts', 'wpinc_delete_old_drafts');

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

Удаление задания при деактивации плагина

Если код будет в плагине, важно очистить планировщик при деактивации:

function wpinc_deactivate_cleanup() {
    $timestamp = wp_next_scheduled('wpinc_daily_delete_old_drafts');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpinc_daily_delete_old_drafts');
    }
}
register_deactivation_hook(__FILE__, 'wpinc_deactivate_cleanup');

Использование готовых плагинов для удаления старых черновиков

Если вы не хотите писать код, можно использовать готовые плагины. Вот несколько, которые помогут:

  • WP Bulk Delete — позволяет массово удалять записи по разным параметрам, включая статус и дату создания. Удобный интерфейс для настройки.
  • Advanced Database Cleaner — не только удаляет старые черновики, но и оптимизирует базу данных, удаляет ревизии, спам и прочее.
  • Clearfy — популярный плагин для оптимизации WordPress с функцией удаления ненужных данных, в том числе старых черновиков. Подробнее на wpshop.ru.

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

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

function wpinc_delete_old_drafts_custom_post_types() {
    global $wpdb;

    $days = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
    $post_types = array('post', 'product', 'event'); // укажите нужные типы

    $placeholders = implode(',', array_fill(0, count($post_types), '%s'));

    $query = $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_status = 'draft' AND post_type IN ($placeholders) AND post_date < %s",
        ...array_merge($post_types, array($date_threshold))
    );

    $draft_ids = $wpdb->get_col($query);

    if (!empty($draft_ids)) {
        foreach ($draft_ids as $id) {
            wp_delete_post($id, true);
        }
    }
}

Это расширит удаление и на другие типы записей.

Как визуально контролировать удаление черновиков

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

function wpinc_delete_old_drafts_with_log() {
    global $wpdb;

    $days = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $draft_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_status = 'draft' AND post_type = 'post' AND post_date < %s",
        $date_threshold
    ));

    if (!empty($draft_ids)) {
        foreach ($draft_ids as $id) {
            wp_delete_post($id, true);
        }
        // Отправляем уведомление
        wp_mail(
            get_option('admin_email'),
            'Удаление старых черновиков WPINC',
            count($draft_ids) . ' черновиков удалено.'
        );
    }
}

Так вы будете получать отчёт о проделанной работе.

Резюме и рекомендации

Автоматизация удаления старых черновиков — простой способ поддерживать чистоту и оптимизировать работу WordPress. Используйте предложенный код для создания собственного плагина или добавьте в functions.php темы. Если предпочитаете готовые решения, обратите внимание на плагины Clearfy и WP Bulk Delete.

Также регулярно проверяйте базу данных и удаляйте ненужные записи, чтобы сайт работал быстро и без сбоев.

×
Оптимизируй свой сайт!

Скидка -15% на премиум плагин Clearfy Pro

Купить плагин сейчас ⋙