Что такое хук woocommerce_order_status_changed и зачем он нужен
Хук woocommerce_order_status_changed — это действие, которое вызывается при изменении статуса заказа в WooCommerce. Он позволяет запускать собственные функции при переходе заказа из одного статуса в другой. Например, можно автоматически отправлять уведомления, обновлять метаданные заказа, запускать внешние интеграции или менять статус товара в заказе.
Диагностика: как проверить, что хук работает корректно
Для диагностики создадим тестовую функцию, которая будет логировать изменения статуса в файл debug.log. Это поможет понять, вызывается ли хук и с какими параметрами.
add_action('woocommerce_order_status_changed', 'log_order_status_change', 10, 4);
function log_order_status_change($order_id, $old_status, $new_status, $order) {
if (defined('WP_DEBUG') && WP_DEBUG) {
error_log("Order #$order_id status changed from $old_status to $new_status");
}
}После добавления этого кода в functions.php или в кастомный плагин, измените статус любого заказа в админке WooCommerce. Проверьте файл wp-content/debug.log — там должна появиться соответствующая запись.
Пошаговое решение: автоматическое добавление заметки и изменение мета данных при смене статуса
Пример задачи: при смене статуса заказа на completed автоматически добавлять заметку и обновлять мета-поле с датой выполнения.
Шаг 1. Подключаем хук и проверяем новый статус
add_action('woocommerce_order_status_changed', 'auto_note_and_meta_on_completed', 10, 4);
function auto_note_and_meta_on_completed($order_id, $old_status, $new_status, $order) {
if ($new_status !== 'completed') {
return;
}Шаг 2. Добавляем заметку к заказу
$order->add_order_note('Заказ автоматически отмечен как выполненный.');Шаг 3. Обновляем мета-данные заказа
update_post_meta($order_id, '_completed_date', current_time('mysql'));
}Весь код вместе:
add_action('woocommerce_order_status_changed', 'auto_note_and_meta_on_completed', 10, 4);
function auto_note_and_meta_on_completed($order_id, $old_status, $new_status, $order) {
if ($new_status !== 'completed') {
return;
}
$order->add_order_note('Заказ автоматически отмечен как выполненный.');
update_post_meta($order_id, '_completed_date', current_time('mysql'));
}Проверка результата после внедрения
- Перейдите в админку WooCommerce → Заказы
- Измените статус любого заказа на
completed - Откройте заказ и убедитесь, что в разделе заметок появилась запись «Заказ автоматически отмечен как выполненный.»
- Проверьте в базе данных (через phpMyAdmin или WP CLI), что для заказа появилось мета поле
_completed_dateс актуальной датой
Частые ошибки и их исправление
- Ничего не происходит при смене статуса: проверьте, что хук подключен именно с 4 параметрами (
10, 4), иначе функция не получит объект заказа и вызова не будет. - Ошибка «Call to a member function add_order_note() on null»: убедитесь, что в функции есть 4-й параметр
$orderи он корректно передаётся. В старых версиях WooCommerce может не передаваться. - Мета-поля не сохраняются: проверьте права пользователя и отсутствие плагинов, которые блокируют сохранение метаданных.
Практические советы по безопасности и производительности
- Используйте
current_time('mysql')для корректного времени по настройкам WordPress, а неdate(). - Не выполняйте тяжелые операции внутри хука — если нужно, ставьте задачи в очередь или используйте WP Cron.
- Всегда проверяйте тип статуса, чтобы функция не срабатывала лишний раз.
- Для логирования используйте условие
if (defined('WP_DEBUG') && WP_DEBUG), чтобы отключить в продакшене.
Сравнение вариантов реализации автоматизации изменения статуса заказа
| Способ | Преимущества | Недостатки | Пример |
|---|---|---|---|
Хук woocommerce_order_status_changed | Гибкость, возможность доступа к старому и новому статусу, объекту заказа | Требует PHP-кода, может влиять на производительность при сложных операциях | Код из статьи |
| Плагины автоматизации (например, AutomateWoo) | Удобный интерфейс, расширенные возможности без кода | Зависимость от плагина, возможные накладки при обновлениях | Графический настройщик событий и действий |
| WP-Cron задачи | Отложенное выполнение, подходит для тяжелых задач | Не подходит для мгновенной реакции на смену статуса | Запуск через wp_schedule_single_event() |