Диагностика задачи: зачем нужны хуки для обработки заказов в WooCommerce
В WooCommerce часто требуется добавить дополнительную логику при изменении или создании заказа. Это может быть отправка уведомлений, интеграция с внешними системами, автоматическое обновление метаданных или кастомные проверки. Для этого используются хуки — действия (actions) и фильтры (filters), которые позволяют внедрять свой код без изменения ядра WooCommerce.
Если вы заметили, что стандартных возможностей WooCommerce недостаточно для ваших бизнес-процессов, значит, пришло время изучить, как реализовать обработку заказов через хуки.
Пошаговое решение: как добавить обработчик статуса заказа
1. Определяем нужный хук
Для обработки изменения статуса заказа в WooCommerce есть хук woocommerce_order_status_changed. Он вызывается при любом изменении статуса заказа и передает параметры:
$order_id— ID заказа;$old_status— предыдущий статус;$new_status— новый статус;$order— объект заказа.
2. Добавляем функцию-обработчик
Пример добавления функции, которая логирует смену статуса в файл wp-content/debug.log:
add_action('woocommerce_order_status_changed', 'my_custom_order_status_change', 10, 4);
function my_custom_order_status_change($order_id, $old_status, $new_status, $order) {
if ($new_status === 'completed') {
error_log("Заказ #" . $order_id . " изменен на статус 'completed'.");
// Здесь можно добавить дополнительную логику
}
}
3. Подключаем код правильно
Добавьте код в файл functions.php активной темы или создайте небольшой плагин, чтобы изменения не потерялись при обновлении темы.
Как проверить, что обработчик сработал
1. Включите логирование ошибок, если оно отключено, добавив в wp-config.php:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
2. Измените статус любого заказа в панели WooCommerce на «Завершен» (completed).
3. Откройте файл wp-content/debug.log и найдите запись с номером заказа.
Если запись появилась — обработчик работает.
Частые ошибки и способы их устранения
- Код не срабатывает: убедитесь, что функция подключена и нет синтаксических ошибок. Проверьте, что при добавлении обработчика указан правильный приоритет и количество аргументов (
10, 4). - Нет лога в debug.log: проверьте настройки
WP_DEBUGи права на запись в папкуwp-content. - Неверный статус: используйте именно системные статусы WooCommerce (
pending,processing,completedи т.п.), а не строки на русском. - Конфликт с другими плагинами: временно отключите другие плагины, если код не срабатывает.
Расширение: добавление кастомного поля при смене статуса
Пример добавления мета-данных к заказу при переходе в статус processing:
add_action('woocommerce_order_status_changed', 'add_custom_meta_on_status', 10, 4);
function add_custom_meta_on_status($order_id, $old_status, $new_status, $order) {
if ($new_status === 'processing') {
$order->update_meta_data('_custom_processing_time', current_time('mysql'));
$order->save();
}
}
Сравнение способов обработки заказов: хуки vs плагины
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Хуки в functions.php или плагине | Гибкость, контроль, не нагружает сайт, можно быстро отладить | Требует навыков разработки, возможность ошибок | При индивидуальной логике, интеграциях, кастомизации |
| Плагины для обработки заказов | Легко установить, часто имеют UI, поддержка | Могут влиять на производительность, ограничены функционалом | Для стандартных задач без кастомных требований |
Практические советы по безопасности и производительности
- Избегайте тяжелых операций в хуках, вызываемых при каждом изменении заказа — лучше ставьте задачи на крон или очереди.
- Всегда проверяйте права доступа и валидируйте данные, особенно при взаимодействии с внешними сервисами.
- Используйте транзиенты или кэширование, если обрабатываете часто вызываемые хуки.
- Логируйте только при необходимости, чтобы не забивать диск логами.