Проблема: как автоматически реагировать на смену статуса заказа в WooCommerce
В WooCommerce часто требуется запускать определённые процессы при изменении статуса заказа: отправлять кастомные уведомления, интегрироваться с CRM, менять метаданные заказа или запускать сторонние сервисы. Без прямой обработки событий это приходится делать вручную или с помощью громоздких плагинов, что не всегда удобно и эффективно.
Почему стандартных настроек WooCommerce недостаточно
WooCommerce по умолчанию отправляет базовые уведомления и изменяет статус заказа, но не покрывает все возможные сценарии автоматизации, которые нужны в бизнесе. Для более гибкой настройки необходима работа с хуками, позволяющая запускать свой код в момент смены статуса.
Диагностика: как понять, что хук работает неверно
- Ваш кастомный код не выполняется при смене статуса заказа.
- Код выполняется, но с задержкой или не для всех статусов.
- Возникают ошибки PHP или конфликты с другими плагинами.
Для диагностики рекомендуется включить WP_DEBUG и просмотреть логи ошибок, а также проверить, что ваш код подключён и активен.
Пошаговое решение: использование хука woocommerce_order_status_changed
Этот хук срабатывает при любом изменении статуса заказа и передаёт параметры для детальной обработки.
add_action('woocommerce_order_status_changed', 'custom_on_order_status_change', 10, 4);
function custom_on_order_status_change($order_id, $old_status, $new_status, $order) {
// Проверяем изменение на нужный статус
if ($new_status === 'completed') {
// Например, добавляем мета-данные или отправляем письмо
update_post_meta($order_id, '_custom_completed_time', current_time('mysql'));
// Логируем для отладки
error_log("Order #$order_id статус изменён на completed");
}
}
Ключевые моменты:
- Используйте 4 параметра, чтобы получить всю информацию о заказе.
- Проверяйте конкретные статусы, чтобы избежать лишних вызовов.
- Используйте
error_logдля отладки.
Пример отправки кастомного письма при смене статуса на processing
add_action('woocommerce_order_status_changed', 'send_custom_email_on_processing', 10, 4);
function send_custom_email_on_processing($order_id, $old_status, $new_status, $order) {
if ($new_status === 'processing') {
$to = $order->get_billing_email();
$subject = 'Ваш заказ в обработке';
$message = 'Спасибо за покупку! Ваш заказ №' . $order_id . ' сейчас обрабатывается.';
wp_mail($to, $subject, $message);
}
}
Проверка результата после внедрения
- Создайте тестовый заказ в WooCommerce.
- Измените статус заказа вручную (через админку или программно).
- Проверьте, что выполняются нужные действия (например, добавление мета, отправка письма).
- Просмотрите лог ошибок WordPress (обычно
wp-content/debug.log), если включён режим отладки.
Частые ошибки и как их исправить
- Код не выполняется: проверьте, что ваш хук добавлен в файл functions.php или в плагин, и что этот файл загружается.
- Параметры функции не совпадают: функция должна принимать 4 аргумента, иначе данные будут неполными.
- Письма не отправляются: убедитесь, что
wp_mailнастроена правильно и сервер поддерживает отправку почты. - Конфликты с другими плагинами: попробуйте временно отключить другие плагины и проверить работу хука.
Практические советы по безопасности и производительности
- Не запускайте тяжелые операции напрямую в хуке — если нужно что-то долгое, используйте WP Cron или очередь задач.
- Проверяйте права доступа и валидируйте данные, если будете изменять заказ или пользовательские метаданные.
- Для логов используйте
error_logтолько для отладки и отключайте в продакшене. - Если отправляете письма, используйте сторонние SMTP решения для надежности.
Сравнение вариантов автоматизации на смену статуса заказа
| Метод | Преимущества | Недостатки | Когда использовать |
|---|---|---|---|
use hook woocommerce_order_status_changed | Максимальная гибкость, полный контроль | Требует знаний PHP, может влиять на производительность при тяжелом коде | Для кастомных сценариев автоматизации |
| Плагины автоматизации WooCommerce | Легко использовать, готовые функции | Меньшая гибкость, могут конфликтовать | Быстрая настройка без кода |
| Использование сторонних сервисов (Zapier и др.) | Интеграции с внешними системами | Зависимость от внешних сервисов, задержки | Для интеграции с CRM и маркетингом |