Что такое хук 'woocommerce_order_status_changed' и зачем он нужен
Хук woocommerce_order_status_changed в WooCommerce срабатывает при изменении статуса заказа. Он позволяет запустить кастомный код, реагирующий на смену статуса — например, отправить уведомление, обновить пользовательские метаданные, интегрироваться с внешними сервисами или запускать бизнес-логику.
Использование этого хука — стандартный способ автоматизации процессов на основе изменений заказов, что критично для магазинов с нестандартными сценариями обработки.
Диагностика: как понять, что хук срабатывает некорректно
- Отсутствует реакция на смену статуса в логике вашего плагина или темы.
- Ошибки PHP или предупреждения при переключении статуса заказа.
- Нет записей в логах, если вы их используете для отладки.
- Функции, привязанные к хуку, не вызываются — возможно, хук добавлен неправильно.
Пошаговое решение: как правильно использовать хук 'woocommerce_order_status_changed'
Шаг 1. Добавьте обработчик в functions.php или в плагин
add_action('woocommerce_order_status_changed', 'my_custom_order_status_changed', 10, 4);
function my_custom_order_status_changed($order_id, $old_status, $new_status, $order) {
// Ваш код автоматизации
}Параметры функции:
$order_id— ID заказа$old_status— старый статус (например, 'pending')$new_status— новый статус (например, 'completed')$order— объект WC_Order
Шаг 2. Добавьте конкретную логику, например, отправка письма после оплаты
function my_custom_order_status_changed($order_id, $old_status, $new_status, $order) {
if ($new_status === 'completed' && $old_status !== 'completed') {
// Отправляем письмо админу
$to = get_option('admin_email');
$subject = 'Заказ #' . $order_id . ' оплачен';
$message = 'Заказ #' . $order_id . ' был оплачен и готов к обработке.';
wp_mail($to, $subject, $message);
}
}Шаг 3. Используйте кастомные метаданные для отслеживания состояния
function my_custom_order_status_changed($order_id, $old_status, $new_status, $order) {
// Обновляем метаданные заказа
update_post_meta($order_id, '_my_custom_status', $new_status);
}Проверка результата после внедрения
- Измените статус заказа в админке WooCommerce и проверьте, сработал ли ваш код (например, пришло ли письмо).
- Добавьте временный
error_logили используйте плагин для логирования, например Query Monitor, для проверки вызова функции. - Проверьте наличие и актуальность метаданных заказа через базу данных или админку.
Частые ошибки и как их исправить
- Ошибка: Не указан приоритет или количество аргументов при добавлении хука.
Решение: Используйтеadd_action('woocommerce_order_status_changed', 'function_name', 10, 4);— 4 аргумента обязательны. - Ошибка: Попытка использовать объект $order без проверки.
Решение: Проверьте, что$order— объект WC_Order:if ( ! $order instanceof WC_Order ) { $order = wc_get_order($order_id); } - Ошибка: Отправка почты не происходит из-за отсутствия настроек SMTP.
Решение: Настройте SMTP через плагин (например, WP Mail SMTP) для корректной отправки писем. - Ошибка: Код срабатывает несколько раз на одно изменение.
Решение: Добавьте проверку старого и нового статуса, чтобы запускать код только при нужном переходе.
Практические советы по безопасности и производительности
- Не помещайте тяжелые задачи в обработчик хука — используйте WP-Cron или очереди для асинхронной обработки.
- Проверяйте права пользователя и данные перед выполнением действий с заказом.
- Используйте nonce и проверку capability, если хук запускает действия через AJAX или формы.
- Для логирования ошибок используйте специализированные плагины или функцию
error_logс условием debug.
Сравнение подходов для автоматизации на смену статуса заказа
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Хук woocommerce_order_status_changed | Запуск кода при смене статуса заказа | Прямой, встроенный, гибкий | Не подходит для долгих задач |
| WP-Cron с проверкой статусов | Отложенная обработка статусов заказов по расписанию | Отделяет тяжелую обработку | Задержки, зависит от посещаемости сайта |
| Внешние сервисы (Webhook, API) | Интеграция с внешними системами | Масштабируемость, надежность | Сложность настройки, задержки |