Диагностика задачи: зачем автоматизировать смену статуса заказа в 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 |