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

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

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

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

Для удаления старых записей WP-Cron идеально подходит, так как позволяет настроить регулярный запуск специальной функции, которая будет удалять записи старше определённого времени. Это особенно актуально для сайтов с новостями, блогами и другими типами контента, где важна актуальность.

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

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

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

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

    $old_posts = get_posts([
        'date_query' => [
            [
                'column' => 'post_date',
                'before' => $date_threshold,
            ],
        ],
        'post_type' => 'post',
        'post_status' => 'publish',
        'fields' => 'ids',
        'numberposts' => -1,
    ]);

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

Далее нужно зарегистрировать событие WP-Cron, которое будет запускать эту функцию, например, раз в сутки.

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

add_action('wpbe_daily_delete_old_posts_event', 'wpbe_auto_delete_old_posts');

Этот код проверит, есть ли уже запланированное событие, и если нет — создаст его. Затем при срабатывании события будет вызвана функция удаления.

Управление расписанием и дополнительные настройки WP-Cron

По умолчанию WordPress поддерживает несколько интервалов для WP-Cron: hourly, twicedaily и daily. Чтобы расширить возможности, можно добавить собственные интервалы, например, еженедельно.

function wpbe_custom_cron_schedules($schedules) {
    $schedules['weekly'] = [
        'interval' => 7 * 24 * 60 * 60, // 7 дней в секундах
        'display' => __('Еженедельно')
    ];
    return $schedules;
}
add_filter('cron_schedules', 'wpbe_custom_cron_schedules');

После добавления интервала можно заменить 'daily' в wp_schedule_event на 'weekly' для запуска задачи раз в неделю.

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

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

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

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

  • WP Bulk Delete — позволяет фильтровать записи по дате, категории, статусу и удалять их по расписанию. Поддерживает интеграцию с WP-Cron.
  • Auto Delete Posts — простой плагин для автоматического удаления записей по времени.

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

Рекомендации по безопасности и резервному копированию

Удаление записей — операция необратимая, особенно если используется параметр wp_delete_post($post_id, true), который удаляет запись без помещения в корзину. Поэтому перед внедрением автоматического удаления обязательно настройте регулярное резервное копирование базы данных.

Также можно добавить логирование удалённых записей для мониторинга работы скрипта. Например, записывать ID и дату удаления в отдельный файл или таблицу.

function wpbe_log_deleted_post($post_id) {
    $log_entry = date('Y-m-d H:i:s') . ' - Deleted post ID: ' . $post_id . PHP_EOL;
    file_put_contents(WP_CONTENT_DIR . '/deleted-posts.log', $log_entry, FILE_APPEND);
}

function wpbe_auto_delete_old_posts() {
    $days = 180;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
    $old_posts = get_posts([
        'date_query' => [[ 'column' => 'post_date', 'before' => $date_threshold, ]],
        'post_type' => 'post', 'post_status' => 'publish', 'fields' => 'ids', 'numberposts' => -1,
    ]);
    if (!empty($old_posts)) {
        foreach ($old_posts as $post_id) {
            wp_delete_post($post_id, true);
            wpbe_log_deleted_post($post_id);
        }
    }
}

Заключение. Практика на wpbe.ru

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

На сайте WPSHOP вы также можете найти полезные инструменты и плагины для расширения возможностей WordPress, которые помогут в управлении контентом и автоматизации.

Как использовать REST API в WordPress для создания приложений
29.11.2025
Как удалить все посты определённого автора в WordPress
19.02.2026
WooCommerce: автоматическое удаление заказов по просроченным срокам
04.06.2026
Как использовать AJAX для динамической загрузки контента в WordPress
01.02.2026
Как добавить автоподсказки в поиск WordPress
05.01.2026