Что такое хук 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 |