Диагностика проблемы: почему нужно менять статусы заказов автоматом
В WooCommerce часто возникает задача автоматически изменять статус заказа, например, после возврата, отмены или по истечении определенного времени. Это нужно для оптимизации работы магазина и уменьшения ручной работы менеджеров.
Если статусы не меняются автоматически, это ведет к ошибкам в учете, задержкам в обработке заказов и ухудшению клиентского опыта.
Пошаговое решение: использование хуков WooCommerce для изменения статусов
1. Хук для автоматической отмены заказа через 24 часа без оплаты
Добавим в functions.php следующий код, который отменит неоплаченные заказы через сутки:
add_action('woocommerce_order_status_pending', 'auto_cancel_unpaid_orders');
function auto_cancel_unpaid_orders($order_id) {
$order = wc_get_order($order_id);
$date_created = $order->get_date_created();
if (!$date_created) return;
$now = new DateTime('now', new DateTimeZone('UTC'));
$diff = $now->getTimestamp() - $date_created->getTimestamp();
// Если прошло более 24 часов
if ($diff >= 86400) {
$order->update_status('cancelled', 'Order cancelled automatically after 24 hours without payment');
}
}
Этот код сработает при каждом изменении статуса на "pending" (ожидание оплаты) и проверит, прошло ли 24 часа. Если да — отменит заказ.
2. Автоматическое перевод заказа в статус "завершен" после доставки
Если вы интегрируете службу доставки с WooCommerce, можно автоматически переводить заказ в статус "completed" по событию доставки. Например, на событие изменения мета-поля доставки:
add_action('woocommerce_update_order', 'auto_complete_order_on_delivery');
function auto_complete_order_on_delivery($order_id) {
$order = wc_get_order($order_id);
$delivery_status = get_post_meta($order_id, '_delivery_status', true);
if ($delivery_status === 'delivered' && $order->get_status() !== 'completed') {
$order->update_status('completed', 'Order automatically completed after delivery');
}
}
Замените '_delivery_status' на реальное мета-поле вашей системы доставки.
Проверка результата после внедрения
- Создайте тестовый заказ со статусом "pending" и дождитесь 24 часов или измените дату создания заказа в базе для теста.
- Проверьте, что заказ автоматически изменился на "cancelled".
- Для второй функции обновите мета-поле '_delivery_status' в заказе на 'delivered' и проверьте статус заказа.
- Используйте инструменты отладки, например Query Monitor, для просмотра вызовов хуков и ошибок.
Частые ошибки и как их исправить
- Хук не срабатывает: проверьте правильность имени хука, он должен быть именно таким, как в документации WooCommerce.
- Дата и время не корректны: убедитесь, что используете правильный часовой пояс и формат даты; используйте объекты DateTime для вычислений.
- Функция обновления статуса не меняет статус: проверьте права пользователя, под которым выполняется код, и статус заказа, чтобы не менять статус некорректно.
- Производительность: если код срабатывает слишком часто, добавьте кеширование или проверку условий, чтобы уменьшить нагрузку.
Практические советы по безопасности и производительности
- Используйте проверку nonce и права доступа, если вызываете обновление статуса из AJAX или внешних запросов.
- Избегайте тяжелых операций внутри хуков, особенно при массовом обновлении заказов; лучше использовать WP-Cron для периодических задач.
- Для крупных магазинов с высокой нагрузкой рассмотрите использование отдельного сервиса или плагина для обработки статусов.
- Отслеживайте логи ошибок и событий для быстрой диагностики проблем.
Сравнение подходов: плагин vs кастомный код
| Критерий | Кастомный код | Плагин | Компромисс |
|---|---|---|---|
| Гибкость | Высокая — код можно подстроить под любые задачи | Ограничена функциями плагина | Использовать плагин с возможностью добавления хуков |
| Производительность | Оптимизированный код быстрее | Плагины могут добавлять лишнюю нагрузку | Выбирать легковесные плагины |
| Безопасность | Зависит от качества кода | Проверяется авторами плагина | Комбинировать с аудитом кода |
| Обновления | Самостоятельно поддерживать | Автоматические обновления | Использовать кастом в виде плагина |