WooCommerce: автоматическое удаление заказов по статусу — пошаговое руководство

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

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

Как реализовать автоматическое удаление заказов по статусу в WooCommerce

Выбор статусов для автоматического удаления

Чаще всего удаляют заказы со статусами cancelled, failed или pending, если они не меняются длительное время. Важно быть осторожным, чтобы не удалить полезные данные.

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

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

function wpedu_delete_orders_by_status() {
    // Статусы заказов для удаления
    $statuses_to_delete = array('cancelled', 'failed');
    
    // Срок в днях, после которого заказы удаляются
    $delete_after_days = 30;
    
    $args = array(
        'status' => $statuses_to_delete,
        'limit' => -1,
        'date_created' => '<' . ( new DateTime('-' . $delete_after_days . ' days') )->format('Y-m-d H:i:s'),
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // Полное удаление
    }
}

Шаг 2. Запускаем функцию по расписанию с помощью WP-Cron

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

// Регистрация крон-события
add_action('wp', 'wpedu_schedule_order_deletion');
function wpedu_schedule_order_deletion() {
    if (!wp_next_scheduled('wpedu_delete_orders_cron')) {
        wp_schedule_event(time(), 'daily', 'wpedu_delete_orders_cron');
    }
}

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

Альтернативный вариант: запуск через WP-CLI

Если у вас есть доступ к WP-CLI, можете запускать удаление вручную или по cron вне WordPress:

wp eval '
    $orders = wc_get_orders([
        "status" => ["cancelled", "failed"],
        "limit" => -1,
        "date_created" => "<" . (new DateTime("-30 days"))->format("Y-m-d H:i:s"),
        "return" => "ids"
    ]);
    foreach ($orders as $id) {
        wp_delete_post($id, true);
    }
'

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

Чтобы убедиться в корректной работе, выполните следующие шаги:

  • Проверьте наличие заказов со статусами cancelled или failed, созданных более 30 дней назад, в админке WooCommerce;
  • Запустите функцию вручную (например, временно вызвав wpedu_delete_orders_by_status() через add_action('init', ...)) и убедитесь, что такие заказы удалились;
  • Проверьте логи ошибок и базу данных, чтобы удостовериться, что заказов больше нет;
  • Убедитесь, что заказы с другими статусами или младше 30 дней не удаляются.

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

  • Неправильный формат даты в параметре date_created: WooCommerce ожидает дату в формате Y-m-d H:i:s. Используйте DateTime для её корректного формирования.
  • Отсутствие запуска WP-Cron: если на сайте мало трафика, WP-Cron может не запускаться своевременно. Проверьте работу планировщика или настройте системный cron на сервере.
  • Удаление не тех заказов: убедитесь, что в массиве $statuses_to_delete указаны только нужные статусы и срок удаления адекватен бизнес-процессам.
  • Удаление без резервного копирования: всегда делайте резервную копию базы данных перед внедрением автоматического удаления.

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

  • Всегда используйте wp_delete_post($order_id, true) для полного удаления, чтобы освободить место и избежать мусора;
  • Ограничивайте количество заказов, удаляемых за раз, чтобы избежать таймаутов; при большом объёме добавьте пагинацию;
  • Используйте системный cron вместо WP-Cron на высоконагруженных сайтах для регулярности;
  • Ведите лог удалённых заказов для аудита и восстановления при необходимости;
  • Проверяйте совместимость с другими плагинами, которые работают с заказами (например, бухгалтерия, CRM).

Сравнение вариантов реализации

МетодПреимуществаНедостатки
WP-CronПростая настройка, не требует доступа к серверуЗависит от посещаемости сайта, может не сработать вовремя
WP-CLI + системный cronНадёжный запуск по расписанию, подходит для больших сайтовТребует SSH-доступа и навыков работы с консолью
⭐⭐⭐⭐⭐