WooCommerce: как автоматически удалять отменённые и завершённые заказы по расписанию

Диагностика проблемы с накоплением заказов в WooCommerce

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

Проверить проблему можно через phpMyAdmin или админку WordPress: в разделе WooCommerce → Заказы отфильтровать по статусам «cancelled» и «completed» и посмотреть их количество. Если их тысячи, стоит автоматизировать очистку.

Пошаговое решение: автоматическое удаление заказов по расписанию через WP-Cron

1. Создание функции удаления заказов по статусам

Добавьте следующий код в файл темы functions.php или в отдельный плагин:

function wpnews_delete_old_wc_orders() {
    if ( ! class_exists('WC_Order_Query') ) {
        return;
    }

    // Определяем дату, за которую удаляем заказы (например, старше 30 дней)
    $date_before = date('Y-m-d H:i:s', strtotime('-30 days'));

    $args = array(
        'limit' => -1,
        'status' => array('cancelled', 'completed'),
        'date_created' => '<' . $date_before,
        'return' => 'ids',
    );

    $query = new WC_Order_Query( $args );
    $order_ids = $query->get_orders();

    if ( empty($order_ids) ) {
        return;
    }

    foreach ( $order_ids as $order_id ) {
        wp_delete_post( $order_id, true ); // true - принудительное удаление без корзины
    }
}

2. Регистрация WP-Cron задачи для запуска очистки

Добавьте в functions.php следующий код для создания хука и расписания:

// Регистрируем событие при активации темы/плагина
function wpnews_schedule_order_cleanup() {
    if ( ! wp_next_scheduled( 'wpnews_daily_order_cleanup' ) ) {
        wp_schedule_event( time(), 'daily', 'wpnews_daily_order_cleanup' );
    }
}
add_action( 'wp', 'wpnews_schedule_order_cleanup' );

// Обработчик события
add_action( 'wpnews_daily_order_cleanup', 'wpnews_delete_old_wc_orders' );

// Очистка расписания при деактивации темы/плагина
function wpnews_unschedule_order_cleanup() {
    $timestamp = wp_next_scheduled( 'wpnews_daily_order_cleanup' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wpnews_daily_order_cleanup' );
    }
}
// Вызовите эту функцию при деактивации плагина или темы

3. Ручной запуск для проверки

Для проверки работоспособности кода можно вызвать функцию напрямую из админки, например, добавив временный админ-экшен:

add_action('admin_post_wpnews_manual_order_cleanup', function() {
    if ( current_user_can('manage_woocommerce') ) {
        wpnews_delete_old_wc_orders();
        wp_redirect(admin_url('edit.php?post_type=shop_order&wpnews_cleanup=done'));
        exit;
    }
});

И ссылка для запуска вручную (временно): https://example.com/wp-admin/admin-post.php?action=wpnews_manual_order_cleanup

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

  • Перейдите в WooCommerce → Заказы, отфильтруйте по статусам «отменён» и «завершён».
  • Сравните количество заказов старше 30 дней до и после запуска функции.
  • Можно проверить таблицу wp_posts с типом shop_order и датой публикации (<= 30 дней назад).
  • Если запускаете cron вручную, убедитесь, что редирект с параметром wpnews_cleanup=done срабатывает.

Частые ошибки и способы их исправления

  • WP-Cron не срабатывает: проверьте, вызывается ли cron по расписанию. Если нет, настройте системный cron на вызов wp-cron.php или используйте плагин WP Crontrol для диагностики.
  • Функция не удаляет заказы: убедитесь, что статус заказа указан корректно (cancelled, completed), и что есть заказы старше 30 дней.
  • Удаление не происходит из-за прав: функция wp_delete_post требует права администратора; вызов должен быть из контекста с нужными правами.
  • Заказы не удаляются полностью: параметр true во втором аргументе wp_delete_post обязателен для полного удаления без корзины.

Практические советы по безопасности и производительности

  • Добавляйте логирование действий удаления для аудита и отладки (например, в файл или через error_log).
  • Ограничивайте количество удаляемых заказов за один вызов, чтобы избежать таймаутов и нагрузок (в примере limit = -1, можно заменить на 100 и запускать несколько раз).
  • Защищайте ручной запуск функции через проверку capability и nonce, чтобы избежать несанкционированного вызова.
  • Регулярно делайте резервные копии базы данных перед автоматическими очистками.
  • Если база очень большая, рассмотрите удаление заказов через SQL-запросы с осторожностью, но предпочтительнее использовать WC_Order_Query для корректного удаления связанных данных.

Сравнение способов автоматического удаления заказов

МетодПлюсыМинусы
WP-Cron с WC_Order_Query и wp_delete_postКорректное удаление заказов и связанных метаданных, безопасноТребует правильной настройки WP-Cron, может быть медленным при большом объёме
SQL-запросы напрямую в БДБыстрое удаление большого количества заказовРиск нарушения целостности данных, требует глубокого понимания структуры БД
Плагины для очистки заказов (например, Advanced Database Cleaner)Удобный интерфейс, автоматизацияЗависимость от сторонних решений, может не покрывать все сценарии
Как отложить публикацию постов в WordPress
19.01.2026
Как создать подробный лог для отладки в WordPress
21.11.2025
Как удалить или изменить атрибуты товаров WooCommerce через код
01.05.2026
WooCommerce: как автоматически удалять заказы по статусу с помощью кода
29.05.2026
WooCommerce: как отключить AJAX добавление в корзину для определённых товаров
09.08.2026