Как использовать хук woocommerce_order_status_changed для автоматизации обработки заказов в WooCommerce

Что такое хук woocommerce_order_status_changed и зачем он нужен

Хук woocommerce_order_status_changed — это один из ключевых хуков WooCommerce, который вызывается при изменении статуса заказа. Он позволяет запустить нужные действия в момент перехода заказа из одного статуса в другой, например, отправить уведомление, обновить данные, изменить складские остатки или интегрировать с внешними сервисами.

Использование этого хука даёт гибкость в автоматизации бизнес-процессов, снижая необходимость ручного вмешательства в обработку заказов.

Диагностика проблемы: почему автоматизация обработки заказов не работает

Если вы пробовали автоматизировать обработку заказов, используя хуки, но изменения не срабатывают, проверьте следующие моменты:

  • Подключается ли ваш код в правильное место, например, в файл functions.php темы или в плагин.
  • Используется ли правильный синтаксис для хука и функции обратного вызова.
  • Совпадают ли статусы заказа, которые вы отслеживаете, с фактическими статусами WooCommerce (например, processing, completed, on-hold и т.д.).
  • Нет ли конфликтов с другими плагинами, которые могут перезаписывать статусы или блокировать выполнение вашего кода.
  • Активирован ли режим отладки и есть ли ошибки в логах PHP.

Пошаговое решение: пример автоматизации с использованием woocommerce_order_status_changed

1. Подключение функции к хуку

Добавьте следующий код в functions.php вашей активной темы или в свой собственный плагин:

add_action('woocommerce_order_status_changed', 'wp24_handle_order_status_change', 10, 4);
function wp24_handle_order_status_change($order_id, $old_status, $new_status, $order) {
    // Проверяем переход статуса со 'processing' на 'completed'
    if ($old_status === 'processing' && $new_status === 'completed') {
        // Получаем объект заказа
        // $order уже передан, но для уверенности можно
        if (!$order) {
            $order = wc_get_order($order_id);
        }
        // Выполняем нужные действия: например, отправляем кастомное письмо или обновляем метаданные
        // Пример: добавим мета поле с отметкой о выполнении
        $order->update_meta_data('_custom_processed', 'yes');
        $order->save();
        // Логируем событие для отладки
        error_log("Заказ #$order_id помечен как обработанный после изменения статуса.");
    }
}

2. Расширение функции для интеграции с внешним сервисом

Если нужно отправить данные заказа в CRM или другой API, добавьте код внутри условия:

if ($old_status === 'processing' && $new_status === 'completed') {
    // Пример запроса к API
    $api_url = 'https://example.com/api/order-completed';
    $response = wp_remote_post($api_url, [
        'body' => json_encode([
            'order_id' => $order_id,
            'total' => $order->get_total(),
            'email' => $order->get_billing_email(),
        ]),
        'headers' => [
            'Content-Type' => 'application/json'
        ]
    ]);
    if (is_wp_error($response)) {
        error_log('Ошибка отправки данных заказа в CRM: ' . $response->get_error_message());
    }
}

Проверка результата после внедрения

  • Перейдите в админку WooCommerce и измените статус заказа с processing на completed.
  • Проверьте, обновилось ли метаполе _custom_processed через phpMyAdmin или с помощью плагина для просмотра метаданных.
  • Посмотрите логи PHP (error_log) для сообщений из error_log в вашем коде.
  • Если интегрируете с API, проверьте на стороне сервиса получение данных.

Частые ошибки и как их исправить

  • Неправильное имя хука или параметров: Убедитесь, что используете именно woocommerce_order_status_changed и 4 параметра в функции. Ошибки в параметрах приведут к неработающему коду.
  • Код не подключается: Код должен быть в functions.php активной темы или в плагине, который активен. Проверяйте, что нет синтаксических ошибок.
  • Статусы заказа не соответствуют: Проверьте, что вы сравниваете правильные статусы, например, 'processing', 'completed'. Можно вывести их в лог для контроля:
error_log("Смена статуса заказа #$order_id: $old_status -> $new_status");
  • Ошибки при работе с объектом $order: Иногда $order может быть null, поэтому получите его через wc_get_order($order_id).

Практические советы по безопасности и производительности

  • Используйте минимально необходимые права для API-запросов и храните ключи отдельно от кода.
  • Для длительных операций применяйте асинхронную обработку (wp_remote_post с non-blocking запросом или очередь задач).
  • Логируйте только ошибки и критичные события, чтобы не засорять логи.
  • Проверяйте наличие объекта заказа и валидность данных перед выполнением действий.
  • Если хотите отключить обработчик, используйте remove_action.

Сравнение вариантов реализации автоматизации заказа

МетодГде реализуетсяПреимуществаНедостатки
Хук woocommerce_order_status_changedfunctions.php / плагинГибкость, доступ к объектам заказа, можно отслеживать любые статусыТребует навыков PHP, возможны конфликты с плагинами
Плагины автоматизации (например, AutomateWoo)ПлагинПростота настройки, визуальный интерфейс, готовые шаблоныПлатные, нагрузка на сайт, ограниченная гибкость
Вебхуки WooCommerceНастройки WooCommerceИнтеграция с внешними сервисами без кодаОграниченная логика, нельзя сделать сложную обработку
Как запретить отображение версии WordPress для безопасности сайта
05.03.2026
Как кастомизировать пункты меню в админке WordPress: удаление, переименование и добавление
15.03.2026
Как избежать ошибки memory limit в WordPress
06.04.2026
Как добавить уникальные поля в форму регистрации WordPress с проверкой уникальности
24.02.2026
Как удалить старые ревизии постов в WordPress с помощью PHP кода
22.03.2026