Диагностика проблемы: зачем нужны автоматические действия со заказами
В WooCommerce часто требуется автоматизировать процессы обработки заказов — например, менять их статус, отправлять уведомления, удалять заказы с определённым статусом или по срокам. Без автоматизации эти задачи приходится выполнять вручную, что неэффективно при большом количестве заказов.
Основная сложность — правильно выбрать хуки и методы для автоматизации, чтобы не нарушить логику работы магазина и не потерять данные.
Какие хуки WooCommerce подходят для автоматизации заказов
Для управления заказами через хуки в WooCommerce чаще всего применяются следующие:
woocommerce_order_status_changed— срабатывает при изменении статуса заказа;woocommerce_new_order— при создании нового заказа;woocommerce_order_status_{status}— например,woocommerce_order_status_completed, срабатывает при смене статуса на конкретный;woocommerce_before_order_object_save— перед сохранением объекта заказа;woocommerce_after_order_object_save— после сохранения объекта заказа.
Пошаговое решение: автоматическое изменение статуса заказа по времени с помощью WP-Cron
Шаг 1. Создаём функцию для проверки заказа и изменения статуса
function wpbe_change_order_status_after_days() {
$days = 7; // количество дней для смены статуса
$args = [
'limit' => -1,
'status' => 'processing', // статус, который нужно изменить
'date_modified' => '<' . ( new WC_DateTime() )->modify("-" . $days . " days")->format('Y-m-d H:i:s'),
];
$orders = wc_get_orders($args);
foreach ($orders as $order) {
$order->update_status('completed', 'Статус изменён автоматически через 7 дней');
}
}Шаг 2. Регистрируем WP-Cron задачу для выполнения функции ежедневно
function wpbe_register_cron() {
if (!wp_next_scheduled('wpbe_daily_order_status_update')) {
wp_schedule_event(time(), 'daily', 'wpbe_daily_order_status_update');
}
}
add_action('wp', 'wpbe_register_cron');
add_action('wpbe_daily_order_status_update', 'wpbe_change_order_status_after_days');Шаг 3. Отключаем задание при деактивации темы или плагина
function wpbe_deactivate_cron() {
$timestamp = wp_next_scheduled('wpbe_daily_order_status_update');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpbe_daily_order_status_update');
}
}
register_deactivation_hook(__FILE__, 'wpbe_deactivate_cron');Проверка результата после внедрения
- Подождите 24 часа или вручную вызовите крон (через WP-CLI
wp cron event run wpbe_daily_order_status_updateили плагин WP Crontrol). - Проверьте заказы в статусе
processingстарше 7 дней — их статус должен измениться наcompleted. - Посмотрите в истории заказов комментарии с текстом «Статус изменён автоматически через 7 дней».
Частые ошибки и как их исправить
- Крон не срабатывает: убедитесь, что посетители заходят на сайт, или используйте серверный cron для вызова
wp-cron.php. - Функция не изменяет статус заказов: проверьте правильность аргументов в
wc_get_orders, особенно фильтр по дате и статусу. - Изменения статуса вызывают конфликт с другими плагинами: используйте хуки более аккуратно, избегайте бесконечных циклов статусов.
- Ошибка синтаксиса или вызова функций WooCommerce: убедитесь, что WooCommerce активен и функции доступны в момент вызова.
Практические советы по безопасности и производительности
- Для больших магазинов ограничьте количество заказов, выбираемых за один запуск, например
'limit' => 50, и запускайте обработку несколько раз. - Не используйте слишком частый cron — ежедневно или раз в 12 часов достаточно.
- Обрабатывайте исключения и логируйте ошибки, чтобы быстро выявлять проблемы.
- Минимизируйте количество изменений статусов вручную, чтобы не создавать конфликтов с автоматикой.
Сравнение вариантов автоматизации изменения статуса заказа
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron + хуки WooCommerce | Гибко, встроено в WP, без доп. плагинов | Зависит от посещаемости сайта, требует знаний PHP |
| Плагины автопереключения заказов | Просто настроить, интерфейс | Дополнительная нагрузка, ограниченная кастомизация |
| Внешние скрипты и интеграции | Максимальный контроль, подходит для больших проектов | Сложно настроить, требует серверных знаний |