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

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

Что такое CRON задачи в WordPress и зачем их использовать для очистки базы данных

CRON — это планировщик задач, который позволяет запускать определённые функции по расписанию. WordPress имеет собственный имитационный CRON (wp-cron), который срабатывает при заходе пользователя на сайт и запускает запланированные задачи. Использование CRON помогает автоматизировать рутинные операции, в том числе и очистку базы данных от ненужных данных.

Регулярное удаление старых ревизий, автосохранений и транзиентов помогает:

  • Снизить размер базы данных;
  • Ускорить работу запросов к базе;
  • Избежать возможных ошибок из-за переполнения данных;
  • Поддерживать порядок и удобство администрирования.

Для автоматизации можно использовать как плагины, так и собственные функции с привязкой к CRON.

Основные типы данных для автоматического удаления

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

  • Ревизии записей — сохраняют предыдущие версии постов. Полезны, но их может быть очень много.
  • Автосохранения — временные сохранения, которые остаются в базе после завершения редактирования.
  • Транзиенты — временные кэшированные данные с ограниченным сроком хранения, иногда не удаляются корректно.
  • Старые черновики — записи со статусом draft, не обновляемые долгое время.
  • Комментарии со статусом spam или trash — мусор, который лучше удалять периодически.

На практике автоматизируют очистку этих данных, чтобы база не раздувалась.

Пример функции для удаления ревизий и автосохранений (wptricks_delete_old_revisions)

Создадим функцию, которая удалит все ревизии и автосохранения старше 30 дней.

function wptricks_delete_old_revisions() {
    global $wpdb;
    $days = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
    
    // Удаляем ревизии
    $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_modified < %s",
            $date_threshold
        )
    );

    // Удаляем автосохранения
    $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM {$wpdb->posts} WHERE post_type = 'autosave' AND post_modified < %s",
            $date_threshold
        )
    );
}

Эта функция напрямую удаляет устаревшие ревизии и автосохранения из таблицы wp_posts по дате изменения. Можно запускать её вручную или привязать к CRON.

Как зарегистрировать CRON задачу для автоматической очистки (wptricks_register_cron_event)

Добавим регистрацию еженедельного события для вызова нашей функции.

function wptricks_register_cron_event() {
    if (! wp_next_scheduled('wptricks_cron_cleanup_hook')) {
        wp_schedule_event(time(), 'weekly', 'wptricks_cron_cleanup_hook');
    }
}
add_action('wp', 'wptricks_register_cron_event');

add_action('wptricks_cron_cleanup_hook', 'wptricks_delete_old_revisions');

Так CRON задача будет запускаться раз в неделю и очищать ревизии и автосохранения.

Автоматическое удаление транзиентов (wptricks_delete_expired_transients)

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

function wptricks_delete_expired_transients() {
    global $wpdb;
    $time = time();
    $transients = $wpdb->get_col(
        "SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_%'"
    );

    foreach ($transients as $transient) {
        if (preg_match('/_transient_timeout_(.+)/', $transient, $matches)) {
            $timeout_option = $transient;
            $transient_name = $matches[1];
            $timeout = (int) get_option($timeout_option);
            if ($timeout && $timeout < $time) {
                delete_option($transient_name);
                delete_option($timeout_option);
            }
        }
    }
}

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

Другие полезные автоматизации очистки: удаление старых черновиков и спам-комментариев

Для полной автоматизации рекомендуем также удалять:

  • Черновики старше 60 дней — чтобы убрать неактуальные материалы.
  • Комментарии в статусах spam и trash старше 30 дней — чтобы не засорять базу.

Пример функции удаления старых черновиков:

function wptricks_delete_old_drafts() {
    global $wpdb;
    $days = 60;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
    $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM {$wpdb->posts} WHERE post_status = 'draft' AND post_modified < %s",
            $date_threshold
        )
    );
}

Удаление старых спам и мусорных комментариев:

function wptricks_delete_old_spam_comments() {
    global $wpdb;
    $days = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
    $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM {$wpdb->comments} WHERE comment_approved IN ('spam', 'trash') AND comment_date < %s",
            $date_threshold
        )
    );
}

Готовое решение: объединение функций в единый CRON-хук

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

function wptricks_cron_cleanup_all() {
    wptricks_delete_old_revisions();
    wptricks_delete_expired_transients();
    wptricks_delete_old_drafts();
    wptricks_delete_old_spam_comments();
}
add_action('wptricks_cron_cleanup_hook', 'wptricks_cron_cleanup_all');

И зарегистрировать эту задачу, как показано ранее. Таким образом, раз в неделю вы будете автоматически очищать базу от устаревших данных.

Плагины для автоматизации очистки базы данных в WordPress

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

  • WP-Optimize — комплексное решение для оптимизации базы с возможностью удаления ревизий и мусорных данных.
  • Advanced Database Cleaner — позволяет планировать очистку ревизий, транзиентов, черновиков, спама и мусора.
  • Clearfy Pro — плагин с расширенными функциями оптимизации и очистки базы, поддерживает автоматизацию и множество настроек.

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

Важные советы и предостережения

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

Тестируйте функции на тестовом сайте или локальной копии перед внедрением на живом ресурсе.

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

Если на сайте много пользователей, помните, что wp-cron зависит от посещаемости. Для более точного расписания можно настроить системный CRON на сервере для вызова wp-cron.php.

Как добавить meta robots tag в WordPress для контроля индексации страниц
22.02.2026
WooCommerce: отключение отзывов только для незарегистрированных пользователей
30.04.2026
Как автоматически отключить редактор Gutenberg в WordPress для определённых типов записей
11.01.2026
Как избежать конфликтов между плагинами в WordPress
03.01.2026
WooCommerce: автоматическое создание купонов при заказах
27.04.2026