Диагностика проблемы с просроченными заказами в WooCommerce
В интернет-магазинах на WooCommerce часто возникают заказы, которые долго остаются в статусах ожидания оплаты, отменены или требуют подтверждения. Это засоряет базу данных, замедляет работу сайта и усложняет администрирование. Проблема усугубляется при большом количестве заказов и низкой автоматизации.
Основные признаки проблемы:
- Множество заказов в статусе
pendingилиon-holdстарше нескольких дней; - Заказы не меняют статус автоматически, хотя оплата не поступила;
- Ручное удаление заказов занимает много времени и неэффективно.
Пошаговое решение: автоматическое удаление просроченных заказов с подтверждением администратора
1. Создаем WP-CLI команду для поиска и удаления заказов
WP-CLI позволяет запускать скрипты из консоли, что удобно для администраторов.
if ( defined('WP_CLI') && WP_CLI ) {
WP_CLI::add_command('wc_cleanup_expired_orders', function($args, $assoc_args) {
$status = isset($assoc_args['status']) ? $assoc_args['status'] : 'pending';
$days = isset($assoc_args['days']) ? (int)$assoc_args['days'] : 7;
$confirm = isset($assoc_args['confirm']) ? filter_var($assoc_args['confirm'], FILTER_VALIDATE_BOOLEAN) : false;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'status' => $status,
'date_created' => '<' . $date_threshold,
'limit' => -1,
'return' => 'ids'
];
$orders = wc_get_orders($args);
if (empty($orders)) {
WP_CLI::success("Нет заказов со статусом '{$status}' старше {$days} дней.");
return;
}
WP_CLI::log("Найдено заказов для удаления: " . count($orders));
if (!$confirm) {
WP_CLI::warning("Для удаления добавьте параметр --confirm=true");
return;
}
$deleted_count = 0;
foreach ($orders as $order_id) {
$order = wc_get_order($order_id);
if ($order) {
$order->delete(true);
$deleted_count++;
}
}
WP_CLI::success("Удалено заказов: {$deleted_count}");
});
}
2. Запуск команды из терминала
Из корня сайта выполните:
wp wc_cleanup_expired_orders --status=pending --days=7 --confirm=true
Параметры:
--status— статус заказов для удаления (по умолчаниюpending);--days— удалять заказы старше указанного количества дней (по умолчанию 7);--confirm— подтверждение удаления (обязательный параметр для запуска удаления).
3. Автоматизация с помощью WP-Cron
Чтобы запускать очистку автоматически, добавим задачу WP-Cron, вызывающую вышеописанную функцию без удаления (для проверки) и с удалением при необходимости.
add_action('wp_loaded', function() {
if (!wp_next_scheduled('wc_cleanup_expired_orders_event')) {
wp_schedule_event(time(), 'daily', 'wc_cleanup_expired_orders_event');
}
});
add_action('wc_cleanup_expired_orders_event', function() {
$days = 7;
$status = 'pending';
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'status' => $status,
'date_created' => '<' . $date_threshold,
'limit' => -1,
'return' => 'ids'
];
$orders = wc_get_orders($args);
if (empty($orders)) {
return;
}
foreach ($orders as $order_id) {
$order = wc_get_order($order_id);
if ($order) {
$order->delete(true);
}
}
});
Проверка результата после внедрения
- Запустите WP-CLI команду без
--confirm, чтобы увидеть, сколько заказов будет удалено. - Проверьте базу данных или список заказов в админке WooCommerce — заказы со статусом
pending, старше указанного срока, должны исчезнуть после подтверждения удаления. - Настройте логирование в коде или плагине для контроля работы автоматического WP-Cron.
- Проверьте, что автоматический Cron-запуск выполняется, просмотрев логи или с помощью плагина для мониторинга Cron задач.
Частые ошибки и как их исправить
- Никакие заказы не удаляются при запуске команды: проверьте, что статус и количество дней заданы корректно, а заказы действительно существуют.
- WP-CLI команда не зарегистрирована: убедитесь, что код с
WP_CLI::add_commandзагружается в файле плагина или functions.php и что WP-CLI установлен и доступен. - Удаление не происходит без параметра
--confirm: это сделано специально для безопасности, чтобы избежать случайных удалений. - WP-Cron не запускается: настройте системный cron для вызова
wp-cron.phpили используйте плагин для управления Cron задачами.
Практические советы по безопасности и производительности
- Всегда тестируйте удаление на тестовом сайте, чтобы избежать потери важных данных.
- Добавьте резервное копирование базы данных перед массовым удалением заказов.
- Ограничивайте количество удаляемых заказов за один запуск Cron, чтобы избежать таймаутов.
- Для крупных магазинов рассмотрите реализацию пакетной обработки с пагинацией.
- Используйте права доступа: запускать WP-CLI команду должны только администраторы сервера или сайта.
Сравнение способов реализации удаления просроченных заказов
| Метод | Плюсы | Минусы | Рекомендуется для |
|---|---|---|---|
| WP-CLI команда | Точный контроль, подтверждение удаления, нет нагрузки на фронтенд | Требуется доступ к терминалу, не для новичков | Администраторы и разработчики |
| WP-Cron задача | Автоматизация, без участия человека | Зависит от корректной работы Cron, может не работать на слабых хостингах | Магазины с регулярной нагрузкой |
| Плагины очистки заказов | Простота установки, интерфейс | Меньший контроль, возможны конфликты | Новички, малые магазины |