Зачем использовать хук woocommerce_order_status_completed
В WooCommerce статус заказа completed означает, что оплата прошла успешно, а заказ полностью выполнен. Это оптимальное событие для запуска автоматических действий — отправки уведомлений, активации подписок, интеграции с CRM или ERP, генерации документов и так далее. Использование хука woocommerce_order_status_completed позволяет гарантировать, что действия запускаются только после успешного завершения заказа.
Диагностика проблемы: автоматизация не срабатывает после оплаты
Если у вас автоматические процессы (например, отправка письма, обновление статуса, интеграция с внешней системой) не запускаются после оплаты, вероятно, вы используете неправильный хук или запускаете действия слишком рано (например, на processing). Либо код неправильно зарегистрирован, либо есть ошибки в логике.
Как проверить, что хук не срабатывает
- Добавьте примитивный лог в файл или debug.log:
add_action('woocommerce_order_status_completed', function($order_id) {
error_log('Order #'.$order_id.' completed hook triggered');
});- Оплатите заказ и проверьте файл
wp-content/debug.log(при включенном WP_DEBUG_LOG) - Если записи нет — хук не сработал или код не подключен
Пошаговое решение: правильное использование хука
1. Подключение к хуку
add_action('woocommerce_order_status_completed', 'my_custom_order_completed_action', 10, 1);
function my_custom_order_completed_action($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
// Ваш код автоматизации
// Например, отправка уведомления
$to = $order->get_billing_email();
$subject = 'Спасибо за покупку';
$message = 'Ваш заказ #'.$order_id.' успешно выполнен.';
wp_mail($to, $subject, $message);
}2. Обработка ошибок и логирование
Добавьте проверку и запись ошибок, чтобы отслеживать проблемы в работе кода:
function my_custom_order_completed_action($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) {
error_log('Order #'.$order_id.' not found');
return;
}
$to = $order->get_billing_email();
if (!$to) {
error_log('Order #'.$order_id.' has no billing email');
return;
}
$subject = 'Спасибо за покупку';
$message = 'Ваш заказ #'.$order_id.' успешно выполнен.';
if (!wp_mail($to, $subject, $message)) {
error_log('Failed to send mail for order #'.$order_id);
} else {
error_log('Mail sent for order #'.$order_id);
}
}Проверка результата после внедрения
- Разместите код в
functions.phpдочерней темы или в отдельном плагине - Оформите тестовый заказ с оплатой и доведите до статуса
completed - Проверьте логи в
wp-content/debug.logна наличие записей - Убедитесь, что письмо пришло на указанный email
- Если интеграция с внешними API — проверьте выполнение запросов и ответы сервера
Частые ошибки и как их исправить
- Использование неправильного хука:
woocommerce_order_status_processingсрабатывает раньше, когда оплата не подтверждена, используйтеwoocommerce_order_status_completed. - Отсутствие проверки объекта заказа: всегда проверяйте, что
wc_get_order($order_id)вернул объект. - Ошибки в адресе электронной почты: убедитесь, что
$order->get_billing_email()не пустой. - Кэширование: иногда кэш или плагин оптимизации задерживают выполнение, отключите кэш для админки при отладке.
- Неактивный плагин или тема: убедитесь, что код загружается, и нет конфликтов с другими плагинами.
Практические советы по безопасности и производительности
- Не выполняйте тяжелые операции напрямую в хук, лучше делегировать задачи в фоновый режим через WP-Cron или отдельный обработчик.
- Используйте функции WordPress для логирования, например,
error_log, для отладки, но отключайте их на продакшене. - Если отправка писем важна, интегрируйте SMTP-плагин для надежной доставки.
- Избегайте дублирования действий — проверяйте, что автоматизация не запустилась повторно для одного заказа.
Сравнение способов реализации автоматизации после оплаты WooCommerce
| Метод | Преимущества | Недостатки | Когда использовать |
|---|---|---|---|
Хук woocommerce_order_status_completed | Простота, точное срабатывание после завершения заказа | Не подходит для задач, требующих асинхронности | Отправка уведомлений, триггеры бизнес-логики |
| WP-Cron (отложенные задачи) | Выполнение тяжелых задач без блокировок | Зависимость от посещаемости сайта, задержки в выполнении | Генерация отчетов, интеграция с API |
| Внешние очереди (RabbitMQ, Redis) | Высокая производительность и масштабируемость | Сложность настройки, дополнительные ресурсы | Крупные проекты с большим числом заказов |