WooCommerce: автоматическое удаление заказов по статусу с помощью Cron

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

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

Задача: настроить автоматическое удаление заказов, например, со статусом cancelled или failed, по истечении определённого времени.

Пошаговое решение: настройка Cron задачи для удаления заказов

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

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

function wpzen_delete_orders_by_status() {
    $statuses_to_delete = array('cancelled', 'failed');
    $days_threshold = 30; // Удалять заказы старше 30 дней

    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_threshold . ' days'));

    foreach ($statuses_to_delete as $status) {
        $args = array(
            'status' => $status,
            'limit' => -1,
            'date_created' => '<' . $date_threshold,
            'return' => 'ids',
        );

        $orders = wc_get_orders($args);

        foreach ($orders as $order_id) {
            $order = wc_get_order($order_id);
            if ($order) {
                $order->delete(true); // true — полное удаление из базы
            }
        }
    }
}

2. Регистрируем Cron задачу

Добавьте проверку и регистрацию задачи при инициализации WordPress:

add_action('wpzen_daily_delete_orders_event', 'wpzen_delete_orders_by_status');

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

3. Удаляем Cron задачу при деактивации плагина или отключении темы

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

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

  • Проверьте наличие Cron задачи с помощью плагина Clearfy или WP Crontrol.
  • Создайте тестовые заказы со статусом cancelled и датой старше 30 дней.
  • Запустите Cron вручную (через WP Crontrol) или дождитесь автоматического запуска.
  • Убедитесь, что старые заказы удалены из админки WooCommerce.

Частые ошибки и как исправить

  • Заказы не удаляются: Проверьте, что хук Cron зарегистрирован и активен. Убедитесь, что функция wc_get_orders возвращает ID заказов, а не пустой массив.
  • Удаление происходит, но заказы отображаются в базе: Метод delete(true) удаляет заказ полностью, если передать false, заказ только переносится в корзину. Проверьте, что передаёте true.
  • Cron не запускается на локальном сервере: WP Cron зависит от посетителей сайта. Для локальной разработки используйте системный cron или запускайте задачи вручную через WP CLI.

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

  • Запускайте удаление не чаще раза в сутки, чтобы минимизировать нагрузку на базу.
  • Добавьте в функцию логирование удалённых заказов, чтобы отслеживать процесс:
function wpzen_delete_orders_by_status() {
    $statuses_to_delete = array('cancelled', 'failed');
    $days_threshold = 30;

    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_threshold . ' days'));

    foreach ($statuses_to_delete as $status) {
        $args = array(
            'status' => $status,
            'limit' => -1,
            'date_created' => '<' . $date_threshold,
            'return' => 'ids',
        );

        $orders = wc_get_orders($args);

        foreach ($orders as $order_id) {
            $order = wc_get_order($order_id);
            if ($order) {
                error_log("[WPZen] Удаление заказа #" . $order_id);
                $order->delete(true);
            }
        }
    }
}
  • Перед удалением сделайте резервное копирование базы, чтобы избежать потери данных.

Сравнение подходов к удалению заказов

МетодПлюсыМинусы
Ручное удаление через админку WooCommerceПросто, не требует кодаТрудоёмко при большом количестве заказов
Плагин для массового удаления заказовУдобно, интерфейсДополнительный плагин, может конфликтовать
Автоматизация через WP Cron (код)Автоматично, гибко настраиваетсяТребует навыков программирования, настройка Cron
Как использовать WPRemark для автоматического модераирования комментариев в WordPress
26.03.2026
WooCommerce: как правильно настроить обновление статуса заказа через вебхуки
26.04.2026
WooCommerce: автоматическое удаление недоработанных заказов с помощью PHP и Cron
20.05.2026
Как создать автоматический импорт продуктов в WooCommerce с помощью WPZen
24.12.2025
Как создать динамический виджет в WordPress с применением AJAX
03.12.2025