Что такое хук 'woocommerce_order_status_changed' и зачем он нужен
WooCommerce предоставляет множество хуков для расширения функционала интернет-магазина. Один из самых полезных — woocommerce_order_status_changed. Он срабатывает, когда статус заказа меняется, например, с "обработка" на "выполнен" или "отменён". Использование этого хука позволяет автоматизировать задачи, связанные с изменением статуса заказа: отправку нестандартных уведомлений, обновление данных, интеграции с внешними сервисами и прочее.
Диагностика: как понять, что хук не срабатывает или работает неправильно
Если вы написали обработчик на woocommerce_order_status_changed и замечаете, что он не выполняется, проверьте следующее:
- Правильно ли подключён ваш код (например, в functions.php или в плагине)?
- Нет ли конфликтов с другими плагинами, которые могут отменять выполнение хуков или перехватывать статусы?
- Используете ли вы правильные параметры и подписи функции?
- Проверяйте логи ошибок PHP и WooCommerce, чтобы увидеть возможные сбои.
Пошаговое решение: пример использования хука 'woocommerce_order_status_changed'
Допустим, вы хотите отправлять письмо администратору при смене статуса заказа на "выполнен" и логировать это событие в отдельный файл.
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
add_action('woocommerce_order_status_changed', 'custom_order_status_changed_action', 10, 4);
function custom_order_status_changed_action($order_id, $old_status, $new_status, $order) {
if ($new_status === 'completed') {
// Отправляем письмо админу
$to = get_option('admin_email');
$subject = "Заказ #" . $order_id . " выполнен";
$message = "Заказ с ID " . $order_id . " сменил статус на выполнен.";
wp_mail($to, $subject, $message);
// Логируем событие
$log_entry = date('Y-m-d H:i:s') . " - Заказ #$order_id сменил статус с $old_status на $new_status\n";
file_put_contents(WP_CONTENT_DIR . '/order-status.log', $log_entry, FILE_APPEND | LOCK_EX);
}
}Объяснение кода
- Первым параметром хука идут идентификатор заказа, старый и новый статус, а также объект заказа.
- В условии
$new_status === 'completed'мы проверяем, что новый статус — "выполнен". - Отправляем email администратору.
- Записываем событие в лог-файл
wp-content/order-status.log.
Проверка результата после внедрения
Чтобы убедиться, что всё работает как надо:
- Создайте тестовый заказ в WooCommerce.
- Измените его статус на "выполнен" через админ-панель.
- Проверьте почту администратора — письмо должно прийти.
- Откройте файл
wp-content/order-status.log— там должна появиться новая запись о смене статуса.
Частые ошибки и как их исправить
- Ошибка: Письмо не отправляется.
Причина: Неправильно настроен SMTP илиwp_mailне работает.
Решение: Проверьте настройки почты, используйте SMTP-плагин (например, WP Mail SMTP) для отладки. - Ошибка: Лог-файл не создаётся или не записывается.
Причина: Отсутствуют права на запись в папкуwp-content.
Решение: Проверьте права на папку, выставьте 755 или 775 для каталога, 644 для файла. - Ошибка: Хук не срабатывает.
Причина: Код добавлен в неподходящее место или ошибка PHP блокирует выполнение.
Решение: Включите отладку PHP, проверьте логи, убедитесь, что код выполняется.
Практические советы по безопасности и производительности
- Не записывайте логи в публично доступные каталоги без защиты — создайте файл
.htaccessс запретом доступа или храните логи за пределами публичной папки. - Для сложных операций при смене статуса используйте очереди задач (wp_cron или сторонние сервисы), чтобы не блокировать основной поток.
- Проверяйте, что объект заказа
$orderпередан корректно, чтобы избежать ошибок при вызове методов.
Сравнение способов реализации автоматизации смены статуса заказа
| Способ | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Код в functions.php | Легко внедрить, быстро | Трудно масштабировать, может потеряться при смене темы | Использовать дочернюю тему |
| Создание собственного плагина | Контролируемо, безопасно, переносимо | Требует знаний плагин-разработки | Использовать шаблон плагина |
| Плагины автоматизации (типа AutomateWoo) | Мощный функционал без кода | Платные, могут быть избыточными | Использовать для сложных сценариев |