Проблема: необходимость автоматической смены статусов заказов
В стандартном WooCommerce процесс обработки заказов часто требует ручного изменения статусов. Например, после определённого количества дней заказ должен автоматически переходить из статуса «обработка» в «завершён» или «отменён». Ручное управление занимает время и увеличивает риск забыть обновить статус.
Диагностика задачи
Перед автоматизацией важно чётко определить:
- Какие статусы нужно менять автоматически (например, «обработка» → «завершён»).
- Через сколько дней после создания заказа менять статус.
- Исключения: например, не менять статус, если заказ в статусе «ожидает оплаты».
Для диагностики можно использовать SQL-запросы к базе, чтобы посчитать, сколько заказов подходит под критерии и не были изменены вручную.
Пошаговое решение: добавляем WP-Cron задачу
1. Создаём функцию для смены статусов
function auto_change_order_status() {
$days = 7; // число дней для ожидания
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = array(
'limit' => -1,
'status' => 'processing',
'date_created' => '<' . $date_threshold,
);
$orders = wc_get_orders($args);
foreach ($orders as $order) {
// Проверяем дополнительные условия, если нужны
$order->update_status('completed', 'Автоматическое завершение заказа');
}
}2. Регистрируем WP-Cron задачу
add_action('auto_change_order_status_hook', 'auto_change_order_status');
function activate_auto_change_order_status_cron() {
if (!wp_next_scheduled('auto_change_order_status_hook')) {
wp_schedule_event(time(), 'daily', 'auto_change_order_status_hook');
}
}
add_action('wp', 'activate_auto_change_order_status_cron');3. Отключаем задачу при деактивации плагина или темы
function deactivate_auto_change_order_status_cron() {
$timestamp = wp_next_scheduled('auto_change_order_status_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'auto_change_order_status_hook');
}
}
register_deactivation_hook(__FILE__, 'deactivate_auto_change_order_status_cron');Проверка результата после внедрения
Чтобы проверить работу автоматизации:
- Создайте тестовый заказ и установите дату создания старше 7 дней (можно изменить дату вручную в базе или через плагины).
- Запустите WP-Cron вручную с помощью плагина WP Crontrol или вызовите функцию
auto_change_order_status()напрямую. - Проверьте, что статус заказа изменился на «завершён».
- Просмотрите логи WooCommerce или системные логи для подтверждения вызова функции.
Частые ошибки и как их исправить
- WP-Cron не срабатывает — проблема с посещаемостью сайта. Решение: настроить системный cron на вызов
wp-cron.phpили использовать плагин для управления cron. - Недостаточно прав для изменения статуса — убедитесь, что функция вызывается с нужными правами, и WooCommerce активен.
- Функция обновления статусов не вызывается — проверьте правильность регистрации хука и расписания cron.
- Ошибка в аргументах
wc_get_orders— используйте валидные параметры, например,'date_created' => '<YYYY-MM-DD'или фильтры WP_Query.
Практические советы по безопасности и производительности
- Устанавливайте разумный интервал запуска WP-Cron (не чаще раза в день), чтобы не перегружать сервер.
- Проверяйте наличие заказов перед массовым обновлением, чтобы избежать лишних операций.
- Логируйте изменения статусов для аудита и отката в случае ошибок.
- Если на сайте много заказов, используйте пагинацию или batch-обработку в функции.
Сравнение вариантов реализации автоматической смены статусов
| Способ | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron и кастомный код | Гибкость, нет новых плагинов, полный контроль | Зависит от посещаемости сайта, требует навыков | Код из статьи выше |
| Плагин автоматизации заказов (например, WooCommerce Order Status Manager) | Простота настройки, поддержка | Платный, меньше контроля над логикой | Плагин в репозитории WooCommerce |
| Внешние сервисы (Webhook + API) | Интеграция с CRM и аналитикой | Сложность настройки, задержки | Webhook в WooCommerce + внешние скрипты |