Диагностика проблемы: задержка с удалением неоплаченных заказов
Магазины на WooCommerce часто сталкиваются с накоплением неоплаченных заказов, которые занимают ресурсы базы данных и влияют на аналитические отчёты. Стандартная функция WooCommerce автоматически отменяет неоплаченные заказы через 60 минут, но этот механизм не гибкий и не учитывает разные статусы заказов или разные сроки для товаров из разных категорий.
Чтобы улучшить бизнес-процессы, нужно реализовать автоматическое удаление неоплаченных заказов с учётом конкретных статусов и индивидуальных таймаутов, например:
- Заказы в статусе
pendingудалять через 30 минут - Заказы в статусе
on-holdудалять через 2 часа - Заказы в статусе
failedудалять сразу
Пошаговое решение: создание кастомного кода для автоматического удаления заказов
1. Отключение стандартного автоотмены WooCommerce
Для начала нужно отключить стандартную функцию отмены неоплаченных заказов:
remove_action( 'woocommerce_cancel_unpaid_orders', 'wc_cancel_unpaid_orders' );2. Добавление собственного WP-Cron задания
Добавим новую задачу, которая будет срабатывать, например, каждые 15 минут:
add_action( 'init', function() {
if ( ! wp_next_scheduled( 'custom_wc_auto_delete_unpaid_orders' ) ) {
wp_schedule_event( time(), 'quarterhour', 'custom_wc_auto_delete_unpaid_orders' );
}
});
add_filter( 'cron_schedules', function( $schedules ) {
$schedules['quarterhour'] = [
'interval' => 900, // 15 минут
'display' => __( 'Every 15 Minutes' ),
];
return $schedules;
});3. Реализация функции удаления заказов по статусам и срокам
Основная логика — получать заказы с нужными статусами, проверять дату создания и удалять, если срок превышен:
add_action( 'custom_wc_auto_delete_unpaid_orders', function() {
$statuses = [
'pending' => 30 * MINUTE_IN_SECONDS, // 30 минут
'on-hold' => 2 * HOUR_IN_SECONDS, // 2 часа
'failed' => 0, // сразу удалять
];
foreach ( $statuses as $status => $expiration ) {
$args = [
'limit' => -1,
'status' => $status,
'date_created' => '<' . ( time() - $expiration ),
];
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
$order->delete( true ); // true — принудительное удаление
}
}
});Проверка результата после внедрения
Чтобы убедиться, что код работает:
- Создайте тестовые заказы с разными статусами (
pending,on-hold,failed) и отметьте время создания - Подождите время, превышающее указанные интервалы (например, 35 минут для
pending) - Запустите WP-Cron вручную через плагин WP Crontrol или дождитесь автозапуска
- Проверьте в админке WooCommerce, что соответствующие заказы удалились
Частые ошибки и как их исправить
- Код не выполняется — WP-Cron не запускается
Проверьте, что WP-Cron включён и запускается. Для теста можно вызвать хук вручную через wp-cli:wp cron event run custom_wc_auto_delete_unpaid_orders - Заказы не удаляются, а только отменяются
Метод$order->delete(true)удаляет заказ навсегда. Если используется$order->update_status('cancelled'), то заказ просто меняет статус, а не удаляется. - Удаляются не те заказы
Проверьте правильность параметраdate_createdвwc_get_orders. Он должен быть в формате даты или сравнением с timestamp, как в примере. - Перегрузка базы данных при большом количестве заказов
Добавьте ограничение'limit' => 20и обработку порциями с последующим повторным запуском.
Практические советы по безопасности и производительности
- Безопасность: Удаление заказов — необратимая операция. Перед внедрением сделайте резервную копию базы данных.
- Производительность: Не запускайте очистку чаще, чем раз в 15 минут, чтобы не нагружать сервер.
- Логирование: Для отладки добавьте запись действий удаления в отдельный лог-файл через
error_logили системный лог. - Проверка прав: Убедитесь, что код выполняется с необходимыми правами на сервере, особенно если WP-Cron запускается не через HTTP.
Сравнение вариантов реализации автоматического удаления заказов
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron с кастомным кодом | Гибкость настройки статусов и сроков; не требует плагинов | Зависит от выполнения WP-Cron, возможна задержка | Код из статьи |
| Плагин для автоотмены заказов | Простота установки и настройки | Меньше гибкости, может быть нагрузка от плагина | Clearfy Pro — оптимизация WooCommerce |
| Внешний cron (через сервер) | Надёжное выполнение по расписанию | Требуется доступ к серверу и настройка | curl вызов wp-cron.php или wp-cli команда |