Диагностика проблемы с неактивными заказами в WooCommerce
В интернет-магазинах на WooCommerce часто накапливаются заказы, которые остаются в статусе ожидания оплаты или обработки длительное время. Это мешает анализу продаж, усложняет управление заказами и влияет на производительность базы данных.
Проблема: заказ долго не двигается между статусами, например, «on-hold» или «pending», и не отменяется автоматически.
Для диагностики:
- Проверьте количество заказов в статусах
pendingиon-holdчерез панель администратора WooCommerce (WooCommerce → Заказы). - Используйте SQL-запрос для подсчёта заказов по статусам:
SELECT post_status, COUNT(ID) as total FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status; - Если много заказов в статусах ожидания, значит автоматизация нужна.
Пошаговое решение: автоматическое отключение неактивных заказов
1. Создание функции для автоматической отмены заказов
Добавим код в файл functions.php дочерней темы или подключаемый плагин:
function wprobot_auto_cancel_inactive_orders() {
$days_inactive = 7; // число дней неактивности
$date = date('Y-m-d H:i:s', strtotime('-' . $days_inactive . ' days'));
$args = array(
'limit' => -1,
'status' => array('pending', 'on-hold'),
'date_created' => '<' . $date
);
$orders = wc_get_orders($args);
foreach ($orders as $order) {
$order->update_status('cancelled', 'Автоматическая отмена заказа из-за неактивности.');
}
}2. Настройка расписания с помощью WP-Cron
Добавим запуск функции раз в сутки:
function wprobot_schedule_auto_cancel() {
if (!wp_next_scheduled('wprobot_daily_cancel_orders')) {
wp_schedule_event(time(), 'daily', 'wprobot_daily_cancel_orders');
}
}
add_action('wp', 'wprobot_schedule_auto_cancel');
add_action('wprobot_daily_cancel_orders', 'wprobot_auto_cancel_inactive_orders');3. Очистка при деактивации
Чтобы не оставлять расписание, удалим событие при отключении плагина:
function wprobot_clear_schedule() {
$timestamp = wp_next_scheduled('wprobot_daily_cancel_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wprobot_daily_cancel_orders');
}
}
register_deactivation_hook(__FILE__, 'wprobot_clear_schedule');Проверка результата после внедрения
- Создайте тестовый заказ в статусе
pendingилиon-holdс датой создания более 7 дней назад (можно вручную в базе данных подправитьpost_date). - Запустите вручную функцию
wprobot_auto_cancel_inactive_orders()через WP CLI или добавьте временный вызов в админке. - Проверьте, что статус заказа изменился на
cancelled. - Убедитесь, что заказы с датой создания менее 7 дней не изменились.
Частые ошибки и как их исправить
- Функция не запускается по расписанию: Проверьте, активен ли WP-Cron, нет ли запрета на HTTP-запросы. Можно использовать плагин WP Crontrol для диагностики.
- Заказы не меняют статус: Убедитесь, что используете правильные статусы и что
wc_get_ordersвозвращает заказы. Проверьте права пользователя и логи ошибок. - Ошибка в формате даты: Дату передавайте строго в формате
Y-m-d H:i:s, используйтеstrtotimeправильно.
Практические советы по безопасности и производительности
- Не запускайте функцию чаще, чем раз в сутки, чтобы не нагружать сервер.
- Добавьте логирование отменённых заказов в отдельный файл или таблицу для аудита.
- Ограничьте количество обрабатываемых заказов за один запуск, если их очень много, чтобы избежать таймаутов.
- Для больших магазинов используйте WP CLI и планировщик задач сервера вместо WP-Cron.
Сравнение вариантов реализации автоматической отмены заказов
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Код с WP-Cron | Гибко, бесплатно, кастомизация | Зависит от WP-Cron, нагрузка на сайт | Пример из статьи |
| Плагин автоматизации (например, WP All Import с cron) | Простота, интерфейс | Платно, меньше гибкости | Плагин с настройками |
| Серверный cron + WP CLI | Высокая производительность, надежность | Требует доступа к серверу | wp cron event run + wp wc order update |