WooCommerce: как использовать хуки для автоматических действий со заказами

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

В WooCommerce часто требуется автоматизировать процессы обработки заказов — например, менять их статус, отправлять уведомления, удалять заказы с определённым статусом или по срокам. Без автоматизации эти задачи приходится выполнять вручную, что неэффективно при большом количестве заказов.

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

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

Для управления заказами через хуки в WooCommerce чаще всего применяются следующие:

  • woocommerce_order_status_changed — срабатывает при изменении статуса заказа;
  • woocommerce_new_order — при создании нового заказа;
  • woocommerce_order_status_{status} — например, woocommerce_order_status_completed, срабатывает при смене статуса на конкретный;
  • woocommerce_before_order_object_save — перед сохранением объекта заказа;
  • woocommerce_after_order_object_save — после сохранения объекта заказа.

Пошаговое решение: автоматическое изменение статуса заказа по времени с помощью WP-Cron

Шаг 1. Создаём функцию для проверки заказа и изменения статуса

function wpbe_change_order_status_after_days() {
    $days = 7; // количество дней для смены статуса
    $args = [
        'limit' => -1,
        'status' => 'processing', // статус, который нужно изменить
        'date_modified' => '<' . ( new WC_DateTime() )->modify("-" . $days . " days")->format('Y-m-d H:i:s'),
    ];
    $orders = wc_get_orders($args);
    foreach ($orders as $order) {
        $order->update_status('completed', 'Статус изменён автоматически через 7 дней');
    }
}

Шаг 2. Регистрируем WP-Cron задачу для выполнения функции ежедневно

function wpbe_register_cron() {
    if (!wp_next_scheduled('wpbe_daily_order_status_update')) {
        wp_schedule_event(time(), 'daily', 'wpbe_daily_order_status_update');
    }
}
add_action('wp', 'wpbe_register_cron');

add_action('wpbe_daily_order_status_update', 'wpbe_change_order_status_after_days');

Шаг 3. Отключаем задание при деактивации темы или плагина

function wpbe_deactivate_cron() {
    $timestamp = wp_next_scheduled('wpbe_daily_order_status_update');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpbe_daily_order_status_update');
    }
}
register_deactivation_hook(__FILE__, 'wpbe_deactivate_cron');

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

  • Подождите 24 часа или вручную вызовите крон (через WP-CLI wp cron event run wpbe_daily_order_status_update или плагин WP Crontrol).
  • Проверьте заказы в статусе processing старше 7 дней — их статус должен измениться на completed.
  • Посмотрите в истории заказов комментарии с текстом «Статус изменён автоматически через 7 дней».

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

  • Крон не срабатывает: убедитесь, что посетители заходят на сайт, или используйте серверный cron для вызова wp-cron.php.
  • Функция не изменяет статус заказов: проверьте правильность аргументов в wc_get_orders, особенно фильтр по дате и статусу.
  • Изменения статуса вызывают конфликт с другими плагинами: используйте хуки более аккуратно, избегайте бесконечных циклов статусов.
  • Ошибка синтаксиса или вызова функций WooCommerce: убедитесь, что WooCommerce активен и функции доступны в момент вызова.

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

  • Для больших магазинов ограничьте количество заказов, выбираемых за один запуск, например 'limit' => 50, и запускайте обработку несколько раз.
  • Не используйте слишком частый cron — ежедневно или раз в 12 часов достаточно.
  • Обрабатывайте исключения и логируйте ошибки, чтобы быстро выявлять проблемы.
  • Минимизируйте количество изменений статусов вручную, чтобы не создавать конфликтов с автоматикой.

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

МетодПлюсыМинусы
WP-Cron + хуки WooCommerceГибко, встроено в WP, без доп. плагиновЗависит от посещаемости сайта, требует знаний PHP
Плагины автопереключения заказовПросто настроить, интерфейсДополнительная нагрузка, ограниченная кастомизация
Внешние скрипты и интеграцииМаксимальный контроль, подходит для больших проектовСложно настроить, требует серверных знаний
WooCommerce: решение проблемы неработающего автозапуска удаления заказов по статусу
19.06.2026
Как создать собственный виджет WordPress с использованием PHP
22.11.2025
WooCommerce: автоматическое удаление заказов по срокам без плагинов
01.06.2026
Как автоматизировать удаление отзывов в WordPress по условиям
12.03.2026
Как автоматически создавать и управлять копиями постов в WordPress
07.02.2026