WooCommerce: автоматическое изменение статуса заказа и отслеживание событий

Почему важно автоматизировать изменение статусов заказов в WooCommerce

В интернет-магазинах на WooCommerce часто возникает задача автоматически менять статусы заказов в зависимости от определённых условий или внешних событий. Это помогает ускорить обработку заказов, снизить количество ошибок и улучшить клиентский сервис.

Типичные сценарии автоматизации

  • Автоматическое переведение заказа в статус «завершён» после отправки товара через API службы доставки.
  • Изменение статуса на «в ожидании оплаты» при создании заказа с определённым методом оплаты.
  • Отмена заказа, если оплата не поступила в течение заданного времени.

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

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

  • Активность хука, на котором основана логика изменения статуса.
  • Корректность условий в коде — нет ли ошибок в логике проверки статуса или метаданных заказа.
  • Отсутствие конфликтов с другими плагинами, которые могут переопределять статус заказа.
  • Логи ошибок PHP и WooCommerce — часто там можно найти подсказки.

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

Рассмотрим практический пример: меняем статус заказа на «completed» через 1 час после перехода в статус «processing».

1. Добавляем функцию с использованием WP-Cron

add_action('woocommerce_order_status_processing', 'schedule_order_status_complete', 10, 1);
function schedule_order_status_complete($order_id) {
    if (!$order_id) return;

    wp_schedule_single_event(time() + 3600, 'auto_complete_order', array($order_id));
}

add_action('auto_complete_order', 'auto_complete_order_callback');
function auto_complete_order_callback($order_id) {
    $order = wc_get_order($order_id);
    if ($order && $order->has_status('processing')) {
        $order->update_status('completed', 'Автоматическое изменение статуса на завершён.');
    }
}

Объяснение:

  • При смене статуса на «processing» запланируем событие через 1 час.
  • При срабатывании события проверяем, что статус всё ещё «processing», и меняем на «completed».

2. Проверяем, что WP-Cron работает

Если WP-Cron отключён или не работает, запланированное событие не сработает. Для проверки запустите вручную:

wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Или используйте плагин WP Crontrol для мониторинга и управления задачами.

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

  • Создайте тестовый заказ и переведите его в статус «processing».
  • Через час проверьте в админке WooCommerce, изменился ли статус на «completed».
  • Проверьте логи WooCommerce для подтверждения записи о смене статуса.

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

  • WP-Cron отключён — автоматизация не сработает. Включите WP-Cron или настройте системный cron на запуск wp-cron.php.
  • Ошибка в ID заказа — убедитесь, что передаётся корректный $order_id в функцию.
  • Конфликты с другими плагинами — временно отключите плагины, которые могут менять статусы заказов, чтобы проверить влияние.
  • Отсутствие прав у пользователя — если используете REST API или внешние вызовы, убедитесь, что есть необходимые права на изменение заказов.

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

  • Используйте wp_schedule_single_event вместо периодических задач, чтобы избежать накопления ненужных событий.
  • Не меняйте статус заказов без проверки текущего статуса — это предотвратит неожиданные баги.
  • Аккуратно работайте с WP-Cron на больших магазинах — большое количество задач может замедлить сайт.
  • Логируйте изменения статусов для аудита и быстрого выявления проблем.

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

МетодПреимуществаНедостатки
Код с WP-CronГибкость, можно точно настроить под бизнес-логикуЗависит от работы WP-Cron, требует навыков программирования
Плагины автоматизации (например, AutomateWoo)Удобный интерфейс, много готовых сценариевПлатные, могут нагружать сайт
Вебхуки и внешние сервисыИнтеграция с внешними системамиСложность настройки, задержки в синхронизации

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

add_action('init', 'handle_delivery_webhook');
function handle_delivery_webhook() {
    if ($_SERVER['REQUEST_METHOD'] !== 'POST' || !isset($_GET['delivery_webhook'])) return;

    $payload = json_decode(file_get_contents('php://input'), true);
    if (!$payload || empty($payload['order_id']) || empty($payload['status'])) {
        wp_die('Invalid data', '', 400);
    }

    $order = wc_get_order($payload['order_id']);
    if (!$order) {
        wp_die('Order not found', '', 404);
    }

    if ($payload['status'] === 'delivered') {
        $order->update_status('completed', 'Статус изменён через webhook службы доставки.');
    }

    wp_die('OK');
}

Для проверки вызовите URL https://example.com/?delivery_webhook=1 с POST-запросом и JSON с данными заказа.

Как массово изменить или удалить атрибуты alt и title в изображениях WordPress
06.12.2025
Автоматическое создание и обновление главных меню в WordPress
16.04.2026
Как автоматизировать удаление старых записей WordPress через шорткод
01.01.2026
WooCommerce: как автоматически удалять товары из магазина по статусу заказов
06.05.2026
Как установить автоматическое удаление просмотров в WordPress
17.03.2026