WooCommerce: использование хука woocommerce_order_status_changed для автоматических действий

Что такое хук woocommerce_order_status_changed и для чего он нужен

В WooCommerce часто требуется запускать определённые действия при смене статуса заказа. Например, отправить уведомление, обновить данные в базе или интегрироваться с CRM. Для этого существует хук woocommerce_order_status_changed, который срабатывает при любом изменении статуса заказа и передаёт параметры: ID заказа, старый статус, новый статус.

Диагностика: проверяем, вызывается ли хук при смене статуса

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

add_action('woocommerce_order_status_changed', function($order_id, $old_status, $new_status) {
    error_log("Order #$order_id changed from $old_status to $new_status");
}, 10, 3);

После изменения статуса заказа проверьте логи PHP (обычно error.log) на наличие записи. Если запись есть — хук работает корректно.

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

Задача: удалить из базы WooCommerce заказы, которые были отменены более 30 дней назад, сразу после смены статуса на cancelled.

1. Подключаем хук и проверяем статус

add_action('woocommerce_order_status_changed', 'auto_delete_old_cancelled_orders', 10, 3);
function auto_delete_old_cancelled_orders($order_id, $old_status, $new_status) {
    if ($new_status !== 'cancelled') {
        return; // Действуем только при смене на cancelled
    }

    $order = wc_get_order($order_id);
    if (!$order) {
        return;
    }

    $cancelled_date = $order->get_date_modified(); // дата изменения
    if (!$cancelled_date) {
        return;
    }

    $date_diff = (time() - $cancelled_date->getTimestamp()) / DAY_IN_SECONDS;
    if ($date_diff < 30) {
        return; // Удаляем только если прошло 30 дней
    }

    // Удаляем заказ
    wp_delete_post($order_id, true);
}

2. Проверяем удаление

Создайте заказ, отмените его и измените дату изменения заказа в базе вручную (например, в phpMyAdmin в таблице wp_posts, поле post_modified) на дату более 30 дней назад. Затем снова смените статус заказа на отменённый — заказ удалится.

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

  • Создайте тестовый заказ.
  • Отмените заказ в админ-панели WooCommerce.
  • Отредактируйте дату отмены (post_modified) на дату более 30 дней назад.
  • Измените статус заказа на «отменён» ещё раз.
  • Проверьте, что заказ удалён из списка заказов.

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

  • Заказы не удаляются: проверьте, что статус именно «cancelled», а не «refunded» или другой.
  • Дата изменения заказа не совпадает с датой отмены: используйте get_date_modified(), а не get_date_created().
  • Удаление не работает из-за прав: убедитесь, что у PHP достаточно прав на удаление записей.
  • Заказы удаляются сразу: проверьте условие с датой — возможно, время в базе не в UTC.

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

  • Удаление заказов напрямую через wp_delete_post с принудительным удалением (true) — безопасно, если вы уверены, что заказ больше не нужен.
  • Для массовой очистки старых заказов лучше использовать отдельный WP-Cron или команду WP-CLI, чтобы не нагружать сайт при смене каждого статуса.
  • Добавьте логирование действий удаления в отдельный файл для аудита.
  • Если нужно интегрировать с внешними сервисами при смене статуса, используйте отдельные хуки или очередь задач для асинхронности.

Таблица сравнения способов удаления старых заказов

МетодПлюсыМинусы
Удаление через хук woocommerce_order_status_changedАвтоматически при смене статуса
Простая реализация
Высокая нагрузка, если много заказов
Зависит от правильной даты
Отдельный WP-Cron для массового удаленияОптимально для большого количества заказов
Планируется выполнение, не влияет на UX
Сложнее настроить
Отсрочка удаления
Удаление вручную через SQL-запросыБыстро для опытных пользователей
Можно удалить сразу много заказов
Риск ошибок в базе
Нет логики WooCommerce
Как создать собственный REST API endpoint в WordPress: подробное руководство
08.11.2025
Как создать собственный шорткод в WordPress: подробное руководство с примерами кода
31.10.2025
Как настроить отладку и логирование в wp-config.php для WordPress
27.03.2026
Как настроить очистку кеша в WordPress: практическое руководство
03.12.2025
Как использовать регулярные выражения в WordPress для фильтрации данных
15.03.2026
×
Прокачай свой WordPress!

Скидка -20% на премиум темы и плагины

Воспользоваться сейчас ⋙