wpcodes.ru wordpress WP Codеs

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

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

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

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

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

Шаг 1. Определяем условие изменения статуса

Для примера настроим автоматическую смену статуса на "завершён" для заказов, которые были оплачены более 7 дней назад.

Шаг 2. Создаём функцию и подключаем к крону WordPress

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

function wpcodes_auto_complete_old_orders() {
    $args = [
        'status' => 'processing',
        'date_created' => '<' . ( new WC_DateTime() )->modify('-7 days')->date('Y-m-d H:i:s'),
        'limit' => -1
    ];
    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        $order->update_status( 'completed', 'Автоматическое завершение заказа после 7 дней.' );
    }
}

// Запускаем каждый час
add_action( 'wpcodes_hourly_event', 'wpcodes_auto_complete_old_orders' );

// Регистрируем крон задачу при инициализации
add_action( 'init', function() {
    if ( ! wp_next_scheduled( 'wpcodes_hourly_event' ) ) {
        wp_schedule_event( time(), 'hourly', 'wpcodes_hourly_event' );
    }
} );

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

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

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

Чтобы проверить, что функция работает:

  • Создайте тестовый заказ в статусе processing с датой создания более 7 дней назад (можно вручную изменить дату в базе или через инструменты разработчика WooCommerce).
  • Запустите крон задачу вручную через WP-CLI: wp cron event run wpcodes_hourly_event.
  • Проверьте, что статус заказа изменился на completed.
  • Также можно проверить логи WooCommerce или добавить error_log внутри функции для отладки.

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

  • Крон не срабатывает: убедитесь, что WP-Cron включён. Для проверки можно добавить define('DISABLE_WP_CRON', false); в wp-config.php. Запускать вручную через WP-CLI помогает проверить проблему.
  • Нет заказов для обработки: проверьте правильность даты и статуса в запросе wc_get_orders. Для отладки временно увеличьте период (например, '-30 days').
  • Ошибки при обновлении статуса: убедитесь, что у заказа есть права на изменение, и что нет конфликтов с другими плагинами. Включите WP_DEBUG для выявления ошибок.

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

  • Для большого магазина с тысячами заказов оптимизируйте запросы, ограничивая выборку и обрабатывая партии заказов по частям.
  • Используйте транзакции и проверяйте права доступа, если функция доступна в пользовательских вызовах.
  • Обрабатывайте ошибки в update_status, чтобы логировать неудачные попытки.
  • Если вам нужно более сложное условие (например, по товарам в заказе), используйте дополнительные фильтры и циклы внутри функции.

Расширение: автоматическая смена статуса по товару в заказе

Пример: меняем статус на "ожидание" если в заказе есть товар с ID 123:

function wpcodes_auto_status_by_product() {
    $args = [
        'status' => [ 'pending', 'processing' ],
        'limit' => -1
    ];
    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        foreach ( $order->get_items() as $item ) {
            if ( $item->get_product_id() === 123 ) {
                $order->update_status( 'on-hold', 'Авто статус для товара ID 123' );
                break;
            }
        }
    }
}
add_action( 'wpcodes_hourly_event', 'wpcodes_auto_status_by_product' );

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

МетодПлюсыМинусыПример
WP-Cron + wc_get_orders + update_status Гибкость, можно настроить любые условия Зависит от WP-Cron, нагрузка при большом количестве заказов Код из статьи
Плагины типа AutomateWoo Интерфейс, сложные сценарии без кода Платные, может быть избыточным https://automatewoo.com/
Webhook + внешние сервисы (IFTTT, Zapier) Интеграции с другими сервисами, автоматизация вне WP Зависимость от сторонних сервисов, задержки Настройка в WooCommerce Webhooks
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее