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

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

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

Диагностика: как проверить, что хук работает корректно

Для диагностики создадим тестовую функцию, которая будет логировать изменения статуса в файл debug.log. Это поможет понять, вызывается ли хук и с какими параметрами.

add_action('woocommerce_order_status_changed', 'log_order_status_change', 10, 4); 
function log_order_status_change($order_id, $old_status, $new_status, $order) {
    if (defined('WP_DEBUG') && WP_DEBUG) {
        error_log("Order #$order_id status changed from $old_status to $new_status");
    }
}

После добавления этого кода в functions.php или в кастомный плагин, измените статус любого заказа в админке WooCommerce. Проверьте файл wp-content/debug.log — там должна появиться соответствующая запись.

Пошаговое решение: автоматическое добавление заметки и изменение мета данных при смене статуса

Пример задачи: при смене статуса заказа на completed автоматически добавлять заметку и обновлять мета-поле с датой выполнения.

Шаг 1. Подключаем хук и проверяем новый статус

add_action('woocommerce_order_status_changed', 'auto_note_and_meta_on_completed', 10, 4);
function auto_note_and_meta_on_completed($order_id, $old_status, $new_status, $order) {
    if ($new_status !== 'completed') {
        return;
    }

Шаг 2. Добавляем заметку к заказу

    $order->add_order_note('Заказ автоматически отмечен как выполненный.');

Шаг 3. Обновляем мета-данные заказа

    update_post_meta($order_id, '_completed_date', current_time('mysql'));
}

Весь код вместе:

add_action('woocommerce_order_status_changed', 'auto_note_and_meta_on_completed', 10, 4);
function auto_note_and_meta_on_completed($order_id, $old_status, $new_status, $order) {
    if ($new_status !== 'completed') {
        return;
    }
    $order->add_order_note('Заказ автоматически отмечен как выполненный.');
    update_post_meta($order_id, '_completed_date', current_time('mysql'));
}

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

  • Перейдите в админку WooCommerce → Заказы
  • Измените статус любого заказа на completed
  • Откройте заказ и убедитесь, что в разделе заметок появилась запись «Заказ автоматически отмечен как выполненный.»
  • Проверьте в базе данных (через phpMyAdmin или WP CLI), что для заказа появилось мета поле _completed_date с актуальной датой

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

  • Ничего не происходит при смене статуса: проверьте, что хук подключен именно с 4 параметрами (10, 4), иначе функция не получит объект заказа и вызова не будет.
  • Ошибка «Call to a member function add_order_note() on null»: убедитесь, что в функции есть 4-й параметр $order и он корректно передаётся. В старых версиях WooCommerce может не передаваться.
  • Мета-поля не сохраняются: проверьте права пользователя и отсутствие плагинов, которые блокируют сохранение метаданных.

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

  • Используйте current_time('mysql') для корректного времени по настройкам WordPress, а не date().
  • Не выполняйте тяжелые операции внутри хука — если нужно, ставьте задачи в очередь или используйте WP Cron.
  • Всегда проверяйте тип статуса, чтобы функция не срабатывала лишний раз.
  • Для логирования используйте условие if (defined('WP_DEBUG') && WP_DEBUG), чтобы отключить в продакшене.

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

СпособПреимуществаНедостаткиПример
Хук woocommerce_order_status_changedГибкость, возможность доступа к старому и новому статусу, объекту заказаТребует PHP-кода, может влиять на производительность при сложных операцияхКод из статьи
Плагины автоматизации (например, AutomateWoo)Удобный интерфейс, расширенные возможности без кодаЗависимость от плагина, возможные накладки при обновленияхГрафический настройщик событий и действий
WP-Cron задачиОтложенное выполнение, подходит для тяжелых задачНе подходит для мгновенной реакции на смену статусаЗапуск через wp_schedule_single_event()
Автоматическое удаление товаров из заказов WooCommerce после отмены или возврата
26.06.2026
Как отключить Gutenberg и вернуть классический редактор WordPress
09.02.2026
Как использовать фильтры WP_Query для комплексного поиска в WordPress
22.03.2026
Создание динамического AJAX-фильтра по категориям и таксономиям в WordPress
15.02.2026
Автоматическое удаление товаров из заказов WooCommerce после отмены или возврата
09.06.2026