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

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

С течением времени в WordPress накапливаются различные черновики, авто-сохранения и устаревшие посты, которые уже не нужны. Это не только захламляет админку, но и нагружает базу данных, увеличивает время резервного копирования и может замедлять сайт. Особенно это актуально для крупных проектов с большим количеством авторов и постоянным созданием контента.

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

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

Как определить, какие записи удалить: критерии и рекомендации

Перед удалением важно понять, какие именно записи стоит удалять автоматически. Обычно под старым черновиком понимаются записи в статусе draft или auto-draft, созданные более 30 дней назад и не изменяемые. Аналогично можно удалять устаревшие записи в статусах pending или даже опубликованные с определенным условием.

Рекомендуется не удалять записи моложе 30 дней, чтобы избежать случайной потери работы, если автор еще не закончил редактирование. Также стоит предусмотреть возможность исключения некоторых записей по ID, категории или меткам.

Реализация автоматического удаления старых черновиков через cron задачу

WordPress предоставляет встроенную систему планировщика задач — WP-Cron. Можно добавить задачу, которая будет регулярно запускаться и удалять старые черновики.

Добавление функции удаления

function wpsetup_delete_old_drafts() {
    global $wpdb;
    $days = 30; // Количество дней для хранения черновиков
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

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

    if (!empty($drafts)) {
        foreach ($drafts as $draft_id) {
            wp_delete_post($draft_id, true); // Полное удаление
        }
    }
}

Регистрация WP-Cron задачи

Добавим задачу, которая будет запускать функцию wpsetup_delete_old_drafts ежедневно:

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

add_action('wpsetup_daily_draft_cleanup', 'wpsetup_delete_old_drafts');

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

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

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

1. WP-Sweep

Очень популярный и бесплатный плагин, который позволяет очищать черновики, ревизии, спам-комментарии и многое другое. Он не автоматизирует удаление по времени, но позволяет быстро удалить ненужные записи вручную. Можно запланировать запуск WP-Cron с помощью дополнительного плагина.

2. Advanced Database Cleaner

Этот плагин позволяет настроить автоматическую очистку базы данных, включая старые черновики и ревизии, с гибкой настройкой расписания. Имеет бесплатную и PRO-версию.

3. Clearfy Pro

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

Как исключить из удаления важные записи и доработать функцию

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

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

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

    // Получаем ID черновиков старше $days дней
    $drafts = $wpdb->get_col($wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->posts} p
         LEFT JOIN {$wpdb->term_relationships} tr ON (p.ID = tr.object_id)
         LEFT JOIN {$wpdb->term_taxonomy} tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
         LEFT JOIN {$wpdb->terms} t ON (tt.term_id = t.term_id)
         WHERE p.post_status IN ('draft', 'auto-draft')
         AND p.post_modified < %s
         AND t.slug != 'save'",
        $date_threshold
    ));

    if (!empty($drafts)) {
        foreach ($drafts as $draft_id) {
            wp_delete_post($draft_id, true);
        }
    }
}

Таким образом, можно гибко настраивать логику удаления.

Тестирование и безопасность

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

Рекомендуется сначала выводить список удаляемых ID через error_log() или на экран, чтобы убедиться, что удаляются только нужные записи.

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

Итоги и рекомендации

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

Рекомендуется комбинировать автоматическую очистку с регулярным резервным копированием и мониторингом состояния сайта. Если вы хотите более продвинутую оптимизацию, обратите внимание на инструменты вроде Clearfy Pro, которые предоставляют комплексные решения по обслуживанию и безопасности WordPress.

Как создать собственный шорткод в WordPress
01.11.2025
Как добавить AJAX фильтрацию товаров в WordPress без перезагрузки страницы
25.01.2026
Как отключить системные email уведомления WordPress без плагинов
28.12.2025
WooCommerce: автоматическое отключение неактивных вариантов товаров
19.05.2026
Как создать автоматический импорт постов в WordPress из внешнего источника
03.04.2026