Диагностика задачи: зачем менять статус заказа автоматически
В WooCommerce стандартные статусы заказов (например, "Обработка", "Выполнен") меняются вручную или после стандартных событий (например, оплата прошла). Но часто требуется более гибкая логика — менять статус заказа автоматически по определённым условиям: сумма заказа, наличие определённых товаров, способ доставки и т.д. Без автоматизации приходится вручную контролировать сотни заказов, что неудобно и чревато ошибками.
Основные способы автоматического изменения статуса заказа в WooCommerce
Есть несколько вариантов реализации автоматического изменения статусов:
- Использовать хуки WooCommerce, например
woocommerce_order_status_changedдля запуска кода при смене статуса. - Использовать крон-задачи для периодической проверки заказов и смены статуса.
- Подключать сторонние плагины с расширенной логикой, но это может влиять на производительность.
Когда использовать хуки, а когда крон
Если изменение статуса зависит от действия пользователя (например, после оплаты), логично использовать хуки. Если нужно менять статус по времени (например, через 3 дня после создания), лучше крон-задачи.
Пошаговое решение: пример автоматической смены статуса при достижении определённой суммы заказа
Допустим, хотим автоматически переводить заказ в статус "Выполнен", если сумма заказа больше 5000 рублей и заказ оплачен.
1. Добавляем кастомный код в functions.php вашей темы или в отдельный плагин
add_action('woocommerce_order_status_processing', 'auto_complete_high_value_orders');
function auto_complete_high_value_orders($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
// Проверяем сумму
$total = $order->get_total();
if ($total > 5000) {
// Меняем статус на 'completed'
$order->update_status('completed', 'Автоматическая смена статуса для заказов свыше 5000');
}
}
Этот код срабатывает, когда заказ переводится в статус "Обработка" (processing). Если сумма больше 5000, статус автоматически меняется на "Выполнен".
2. Проверяем работу
- Создайте тестовый заказ с суммой выше 5000 руб.
- Оплатите заказ (например, тестовым платежом).
- Посмотрите, что статус заказа сначала становится "Обработка", а затем автоматически меняется на "Выполнен".
Автоматическая смена статуса по времени с использованием WP-Cron
Если необходимо менять статус заказов через определённое время — например, переводить в "Отменён" если не оплачен через 3 дня, используем WP-Cron.
Пример кода для отмены неоплаченных заказов через 3 дня
add_action('wp', 'setup_order_status_cron');
function setup_order_status_cron() {
if (!wp_next_scheduled('auto_cancel_unpaid_orders')) {
wp_schedule_event(time(), 'daily', 'auto_cancel_unpaid_orders');
}
}
add_action('auto_cancel_unpaid_orders', 'cancel_unpaid_orders');
function cancel_unpaid_orders() {
$args = [
'limit' => -1,
'status' => 'pending', // неоплаченные
'date_created' => '<' . (time() - 3*24*60*60), // старше 3 дней
];
$orders = wc_get_orders($args);
foreach ($orders as $order) {
$order->update_status('cancelled', 'Автоматическая отмена неоплаченного заказа через 3 дня');
}
}
// Не забудьте очистить крон при деактивации плагина
register_deactivation_hook(__FILE__, 'clear_order_status_cron');
function clear_order_status_cron() {
wp_clear_scheduled_hook('auto_cancel_unpaid_orders');
}
Проверка результата после внедрения
Чтобы убедиться, что автоматическая смена статусов работает:
- Создайте тестовые заказы, подходящие под условия (по сумме, по дате, по статусу).
- Отслеживайте изменение статусов в админке WooCommerce.
- Для WP-Cron используйте плагин WP Crontrol для просмотра и запуска задач вручную.
Частые ошибки и как их исправить
- Хук не срабатывает: Проверьте, что используемый хук актуален и правильно написан. Например,
woocommerce_order_status_processingсрабатывает при смене в статус "Обработка", а не при любом обновлении. - Статус не меняется: Убедитесь, что у заказа есть нужный статус и сумма корректно возвращается через
$order->get_total(). - WP-Cron не запускается: На некоторых хостингах WP-Cron может не работать автоматически. Запустите вручную через WP Crontrol или настройте системный cron для вызова
wp-cron.php. - Код в functions.php вызывает ошибки: Проверьте синтаксис, отключите кеширование и отладку ошибок, чтобы выявить проблему.
Практические советы по безопасности и производительности
- Не запускайте тяжелые операции в хук, лучше делайте отложенную обработку через WP-Cron.
- При массовых изменениях статусов используйте пагинацию в запросах заказов, чтобы не перегружать память.
- Используйте nonce и проверки прав доступа, если код привязан к пользовательским действиям.
- Для сложной логики рассмотрите создание отдельного плагина, чтобы код не терялся при смене темы.
Сравнение вариантов реализации автоматической смены статусов
| Метод | Плюсы | Минусы |
|---|---|---|
| Хуки WooCommerce | Мгновенное срабатывание, простой код | Только при событиях, не подходит для отложенных изменений |
| WP-Cron | Подходит для периодических проверок и массовых изменений | Зависит от работы WP-Cron, возможны задержки |
| Плагины | Готовые решения, поддержка интерфейсов | Может влиять на производительность, лишний функционал |