WooCommerce: автоматическое изменение статуса отменённого заказа

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

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

Основные признаки проблемы:

  • Отменённые заказы не меняют статус автоматически и остаются в списке заказов.
  • Накопление отменённых заказов замедляет работу административной панели.
  • Отсутствие автоматической очистки базы от отменённых заказов.

Пошаговое решение: автоматическое изменение статуса отменённого заказа

Шаг 1. Добавление кастомного хука для автоматической обработки

Используем хук woocommerce_order_status_cancelled, который срабатывает при переводе заказа в статус "отменён". Добавим функцию, которая автоматически переведёт заказ в нужный статус или выполнит дополнительные действия.

add_action('woocommerce_order_status_cancelled', 'wp0_auto_update_cancelled_order_status', 10, 1);
function wp0_auto_update_cancelled_order_status($order_id) {
    if (!$order_id) {
        return;
    }
    $order = wc_get_order($order_id);
    if (!$order) {
        return;
    }

    // Пример: меняем статус с cancelled на failed
    $order->update_status('failed', 'Автоматический перевод заказа из статуса отменён');
}

Шаг 2. Автоматическое удаление отменённых заказов через WP-Cron

Если нужно не просто сменить статус, а удалить отменённые заказы через определённое время, создаём WP-Cron задачу:

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

// Функция удаления заказов
add_action('wp0_delete_cancelled_orders', 'wp0_delete_old_cancelled_orders');
function wp0_delete_old_cancelled_orders() {
    $args = [
        'status' => 'cancelled',
        'date_modified' => '<' . (time() - 30 * DAY_IN_SECONDS), // старше 30 дней
        'limit' => -1
    ];
    $orders = wc_get_orders($args);
    foreach ($orders as $order) {
        $order->delete(true); // удаляем заказ вместе с данными
    }
}

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

Для проверки функционала:

  1. Создайте заказ в WooCommerce и переведите его в статус "Отменён".
  2. Проверьте, что статус заказа изменился на "failed" (или другой, который вы указали).
  3. Если настроена WP-Cron задача — подождите день или вызовите событие вручную через wp cron event run wp0_delete_cancelled_orders в консоли WP-CLI.
  4. Проверьте, что заказы отменённые старше 30 дней удаляются из базы.

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

  • Хук не срабатывает: Проверьте, что функция подключена в файле functions.php вашей темы или в отдельном плагине, и что код выполняется.
  • Заказы не удаляются: Убедитесь, что WP-Cron активен и корректно работает на вашем хостинге. Для проверки можно вызвать событие вручную через WP-CLI.
  • Недостаточно прав для удаления: Функция $order->delete(true) требует прав администратора, убедитесь, что код выполняется с нужными правами.
  • Не тот статус устанавливается: Проверьте, что передаваемый в update_status() статус корректен и зарегистрирован в WooCommerce.

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

  • Не удаляйте заказы сразу после отмены — лучше делать это с задержкой (например, 30 дней), чтобы иметь возможность восстановить данные при необходимости.
  • Используйте WP-Cron с осторожностью на слабых хостингах — нагрузка может сказаться на производительности. Оптимально запускать задачи вручную или через системный cron.
  • Перед массовым удалением заказов сделайте резервную копию базы данных.
  • Минимизируйте код в хуках, чтобы не замедлять обработку заказов.

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

МетодПлюсыМинусы
Смена статуса через woocommerce_order_status_cancelledПростая реализация, мгновенный эффектНе удаляет заказы, только меняет статус
Удаление заказов через WP-CronАвтоматическая очистка базы, уменьшение нагрузкиЗависит от cron, риск удаления нужных данных без контроля
Ручное удалениеПолный контрольТрудоёмко и не автоматизировано

Наш каталог плагинов WordPress