Что такое хук woocommerce_order_status_changed и зачем он нужен
Хук woocommerce_order_status_changed срабатывает при любом изменении статуса заказа в WooCommerce. Он принимает четыре параметра: ID заказа, старый статус, новый статус и объект заказа. С его помощью можно запускать автоматические действия, например, отправлять уведомления, изменять метаданные заказа или интегрировать с внешними сервисами.
Диагностика проблемы: почему автоматизация не срабатывает
Если вы уже пробовали использовать woocommerce_order_status_changed, но ничего не происходит, проверьте следующее:
- Правильно ли указан приоритет и количество аргументов в функции
add_action? - Подключена ли функция к хуку в правильном месте (например, в
functions.phpили в плагине)? - Нет ли ошибок PHP, которые мешают выполнению?
- Меняется ли статус заказа действительно — например, с
pendingнаprocessing?
Для отладки используйте error_log() или включите WP_DEBUG.
Пошаговое решение: пример автоматизации при смене статуса заказа
Рассмотрим простой пример — отправка дополнительного письма клиенту при переходе заказа в статус completed.
add_action('woocommerce_order_status_changed', 'wpmark_send_custom_email_on_completed', 10, 4);
function wpmark_send_custom_email_on_completed($order_id, $old_status, $new_status, $order) {
if ($new_status === 'completed' && $old_status !== 'completed') {
$to = $order->get_billing_email();
$subject = 'Спасибо за покупку!';
$message = 'Ваш заказ #' . $order_id . ' успешно выполнен. Благодарим за выбор нашего магазина.';
wp_mail($to, $subject, $message);
}
}
В этом коде мы проверяем переход только в статус completed, чтобы не отправлять письмо повторно.
Автоматическое обновление мета-данных заказа
Пример: при смене статуса заказа добавляем метку с датой завершения.
add_action('woocommerce_order_status_changed', 'wpmark_update_order_meta_on_completed', 10, 4);
function wpmark_update_order_meta_on_completed($order_id, $old_status, $new_status, $order) {
if ($new_status === 'completed') {
update_post_meta($order_id, '_completed_date', current_time('mysql'));
}
}
Проверка результата после внедрения
- Создайте тестовый заказ в WooCommerce с любым статусом.
- Измените статус заказа на
completedчерез админ-панель. - Проверьте, пришло ли письмо на email из заказа.
- В базе данных через phpMyAdmin или плагин типа WP phpMyAdmin проверьте наличие мета-ключа
_completed_dateу заказа. - Для отладки можно добавить запись в лог через
error_log()внутри функций.
Частые ошибки и как их исправить
- Ошибка: Функция не вызывается.
Причина: Неправильное количество аргументов вadd_actionили неверный хук.
Решение: Убедитесь, что указано 4 аргумента:add_action('woocommerce_order_status_changed', 'function_name', 10, 4); - Ошибка: Письмо не отправляется.
Причина: Отказ в работеwp_mail()из-за настройки сервера.
Решение: Настройте SMTP с помощью плагина WP Mail SMTP или аналогичного. - Ошибка: Дублирование действий.
Причина: Отсутствие проверки перехода статуса.
Решение: Проверяйте, что старый статус не равен новому перед выполнением действий.
Практические советы по безопасности и производительности
- Обрабатывайте данные аккуратно — используйте методы объекта
$orderдля получения данных, избегайте прямого обращения к$_POSTили$_GET. - Не нагружайте хук тяжелыми запросами или вызовами API — если нужно, используйте очередь задач через Action Scheduler или WP-Cron.
- Для отправки писем лучше использовать SMTP, чтобы избежать попадания в спам.
- Логируйте действия в отдельный файл, если требуется аудит изменений заказов.
Сравнение вариантов автоматизации при смене статуса заказа
| Вариант | Плюсы | Минусы | Компромисс |
|---|---|---|---|
Хук woocommerce_order_status_changed | Гибкость, можно выполнять любые действия | Требует навыков PHP, возможны ошибки | Использовать базовые проверки и логи для отладки |
| Плагины для автоматизации (например, AutomateWoo) | Простой интерфейс, множество готовых триггеров | Платные, нагрузка на сайт | Использовать для сложных сценариев, код — для простых |
| Встроенные уведомления WooCommerce | Простота, не требует кода | Ограниченная кастомизация | Добавлять кастомные письма через код, если нужно |