wpgenerate.ru wordpress wpgenerate.ru

WooCommerce: автоматическое изменение статусов заказов по условиям

Диагностика задачи: зачем нужно автоматическое изменение статусов заказов

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

Основные хуки для автоматизации изменения статусов заказов

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

  • woocommerce_order_status_changed — срабатывает при изменении статуса заказа;
  • woocommerce_payment_complete — срабатывает после успешной оплаты заказа;
  • woocommerce_order_status_completed — при переводе заказа в статус "завершён".

В зависимости от задачи выбирайте нужный хук.

Пошаговое решение: пример автоматического перевода заказа в статус "завершён" через 7 дней после оплаты

Этот пример показывает, как с помощью WP-Cron автоматически менять статус заказа спустя неделю после оплаты:

add_action('woocommerce_payment_complete', 'schedule_order_complete_7_days_later');
function schedule_order_complete_7_days_later($order_id) {
    if (!$order_id) return;
    wp_schedule_single_event(time() + 7 * DAY_IN_SECONDS, '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) return;

    // Проверяем, что заказ ещё не завершён
    if ($order->get_status() !== 'completed') {
        $order->update_status('completed', 'Статус изменён автоматически через 7 дней после оплаты');
    }
}

Объяснение:

  • При оплате заказа планируем событие с задержкой 7 дней;
  • При наступлении времени проверяем статус заказа и меняем его, если он ещё не завершён.

Автоматическое изменение статуса для заказов с определёнными товарами

Иногда нужно менять статус заказа, если в нём есть конкретные товары. Например, при наличии товара с ID 123 переводить заказ в статус "ожидает отправки":

add_action('woocommerce_payment_complete', 'set_pending_shipping_if_specific_product');
function set_pending_shipping_if_specific_product($order_id) {
    $order = wc_get_order($order_id);
    if (!$order) return;

    $target_product_id = 123;
    $has_target_product = false;

    foreach ($order->get_items() as $item) {
        if ($item->get_product_id() == $target_product_id) {
            $has_target_product = true;
            break;
        }
    }

    if ($has_target_product) {
        $order->update_status('on-hold', 'Автоматический статус: ожидает отправки, так как в заказе есть товар ID 123');
    }
}

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

1. Создайте тестовый заказ с оплатой, который подходит под условия (например, с товаром ID 123).
2. В админке проверьте, что статус изменился автоматически (например, через 7 дней или сразу после оплаты в зависимости от логики).
3. Для отладки используйте плагин WP Crontrol — он поможет просмотреть и запускать отложенные задачи.
4. Логи можно добавить через error_log или использовать плагины типа Query Monitor.

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

  • Не срабатывает запланированное событие WP-Cron: убедитесь, что на сайте посещения есть (WP-Cron по умолчанию запускается при заходе на сайт). Для сайтов с малым трафиком рекомендуем настроить системный cron на сервере.
  • Статус не меняется: проверьте, что вы используете правильные slug статусов (например, completed, on-hold), а не человекочитаемые названия.
  • Функция вызывается слишком часто: добавляйте проверки, чтобы не назначать одно и то же событие повторно для одного заказа.
  • Отсутствие прав у пользователя для изменения статуса: код, выполняющий смену статуса, должен запускаться с достаточными правами (чаще всего в контексте администратора или сервера).

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

  • Не планируйте слишком много событий для каждого заказа — это может замедлить сайт. Оптимизируйте логику, объединяя задачи.
  • Используйте транзиенты или мета-данные заказов для хранения промежуточного состояния, чтобы избежать повторной обработки.
  • Не выводите отладочную информацию на публичной части сайта.
  • Проверяйте корректность данных заказа перед изменением статуса, чтобы избежать ошибок.

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

СпособПреимуществаНедостаткиПример
WP-Cron с отложенными задачами Гибко, можно ставить задержки, легко интегрировать с хуками WooCommerce Зависит от посещаемости сайта, возможны задержки Пример с 7 днями ожидания (см. выше)
Хуки оплаты и статусов Мгновенное реагирование, простота Не подходит для отложенных задач Изменение статуса сразу после оплаты при наличии товара
Плагины автоматизации (например, WP All Import с cron) Готовые решения с интерфейсом Меньше гибкости, возможно нагромождение Зависит от конкретного плагина
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше