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

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

Что такое WP-Cron и почему он важен для автоматизации задач в WordPress

WP-Cron — это встроенный механизм планировщика заданий в WordPress, который позволяет запускать определённые задачи по расписанию. В отличие от системных cron-задач на сервере, WP-Cron запускается при посещении сайта, что делает его удобным, но требует понимания особенностей.

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

Преимущества использования WP-Cron:

  • Не требует доступа к системному cron;
  • Легко интегрируется с кодом WordPress;
  • Позволяет гибко настраивать периодичность запусков.

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

Определяем критерии удаления

Для начала нужно определить, какие записи считаются устаревшими и подлежат удалению. Обычно это:

  • Публикации, созданные более определённого количества дней назад (например, 180 дней);
  • Ревизии, старше определённого срока;
  • Черновики и записи в корзине (Trash), которые не используются.

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

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

Добавьте в functions.php вашей темы или в кастомный плагин следующий код, который регистрирует задачу и её выполнение:

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

// Хук для выполнения задачи
add_action( 'wpall_cleanup_old_posts', 'wpall_do_cleanup_old_posts' );

function wpall_do_cleanup_old_posts() {
    global $wpdb;
    $days = 180; // количество дней для устаревших записей
    $date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    // Удаляем посты статуса 'trash' старше $days дней
    $wpdb->query( $wpdb->prepare(
        "DELETE p, pm FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id WHERE p.post_status = 'trash' AND p.post_date < %s",
        $date
    ) );

    // Удаляем ревизии старше $days дней
    $wpdb->query( $wpdb->prepare(
        "DELETE p, pm FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id WHERE p.post_type = 'revision' AND p.post_date < %s",
        $date
    ) );

    // Удаляем черновики (draft) старше $days дней
    $wpdb->query( $wpdb->prepare(
        "DELETE p, pm FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id WHERE p.post_status = 'draft' AND p.post_date < %s",
        $date
    ) );
}

В этом коде:

  • Регистрируется ежедневная задача wpall_cleanup_old_posts;
  • В функции wpall_do_cleanup_old_posts происходит удаление записей из таблиц posts и связанных с ними метаданных из postmeta;
  • Используется параметр времени — удаляются данные старше 180 дней.

Автоматическое удаление ревизий с помощью плагинов

Если вы предпочитаете не писать код, существуют плагины, которые помогают управлять ревизиями и старым контентом. Например:

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

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

Особенности и рекомендации по безопасности

При удалении записей важно:

  • Всегда делать резервную копию базы данных перед изменениями;
  • Проверять логику удаления на тестовом сайте;
  • Избегать удаления свежих данных, чтобы не потерять важный контент;
  • Следить за нагрузкой на сервер при выполнении WP-Cron задач;
  • При необходимости использовать системный cron для более надёжного запуска задач.

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

*/30 * * * * wget -q -O - https://ваш_сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Дополнительные советы: как контролировать и логировать процесс удаления

Чтобы отслеживать работу автоматической очистки, можно добавить логирование в файл. Например, расширьте функцию wpall_do_cleanup_old_posts так:

function wpall_do_cleanup_old_posts() {
    global $wpdb;
    $days = 180;
    $date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
    $log_file = WP_CONTENT_DIR . '/wpall_cleanup.log';

    $deleted_trash = $wpdb->query( $wpdb->prepare(
        "DELETE p, pm FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id WHERE p.post_status = 'trash' AND p.post_date < %s",
        $date
    ) );

    $deleted_revisions = $wpdb->query( $wpdb->prepare(
        "DELETE p, pm FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id WHERE p.post_type = 'revision' AND p.post_date < %s",
        $date
    ) );

    $deleted_drafts = $wpdb->query( $wpdb->prepare(
        "DELETE p, pm FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id WHERE p.post_status = 'draft' AND p.post_date < %s",
        $date
    ) );

    $log = sprintf( "%s - Удалено: корзина=%d, ревизии=%d, черновики=%d\n", date('Y-m-d H:i:s'), $deleted_trash, $deleted_revisions, $deleted_drafts );
    file_put_contents( $log_file, $log, FILE_APPEND );
}

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

Оптимизация базы данных WordPress: практические методы и примеры
11.11.2025
Как удалить или отключить XML-RPC в WordPress: практические решения и примеры кода
09.01.2026
Как создать свой шорткод в WordPress
01.11.2025
Оптимизация загрузки картинок в WordPress для ускорения сайта
03.12.2025
Как использовать REST API для создания собственных функций в WordPress
08.11.2025