Диагностика проблемы неоплаченных заказов в WooCommerce
В интернет-магазинах на WooCommerce часто накапливаются неоплаченные заказы, которые занимают место в базе данных и могут влиять на отчёты и аналитику. Без регулярной очистки такие заказы создают шум и усложняют управление. Важно автоматизировать их удаление, но при этом сохранять контроль и вести отчёт о произведённых действиях.
Как понять, что проблема есть?
- В админке WooCommerce в разделе Заказы много заказов в статусе
pendingилиfailed, которые не изменяются длительное время. - Отчёты по продажам показывают некорректные данные из-за множества неактивных заказов.
- Производительность сайта падает при большом количестве заказов в базе.
Пошаговое решение: удаление неоплаченных заказов с отчётом
Для автоматического удаления неоплаченных заказов через заданное время и ведения отчёта предлагается создать кастомный WP-Cron с функцией, которая:
- Выбирает заказы со статусом
pendingилиfailed, старше указанного времени (например, 48 часов). - Удаляет их из базы WooCommerce.
- Записывает сведения об удалённых заказах в отдельный файл отчёта.
1. Регистрируем WP-Cron
add_action('wp', function() {
if (!wp_next_scheduled('wc_auto_delete_unpaid_orders_event')) {
wp_schedule_event(time(), 'hourly', 'wc_auto_delete_unpaid_orders_event');
}
});2. Функция удаления заказов и записи отчёта
add_action('wc_auto_delete_unpaid_orders_event', function() {
$cutoff = strtotime('-48 hours');
$args = [
'status' => ['pending', 'failed'],
'date_created' => '<' . date('Y-m-d H:i:s', $cutoff),
'limit' => -1,
'return' => 'ids',
];
$order_ids = wc_get_orders($args);
if (empty($order_ids)) {
return;
}
$deleted_orders = [];
foreach ($order_ids as $order_id) {
$order = wc_get_order($order_id);
if ($order) {
$deleted_orders[] = [
'ID' => $order_id,
'date' => $order->get_date_created()->date('Y-m-d H:i:s'),
'total' => $order->get_total(),
'status' => $order->get_status(),
];
wp_delete_post($order_id, true);
}
}
// Запись отчёта
$log_path = WP_CONTENT_DIR . '/uploads/unpaid_orders_deletion_log.csv';
$is_new_file = !file_exists($log_path);
$handle = fopen($log_path, 'a');
if ($is_new_file) {
fputcsv($handle, ['Order ID', 'Date Created', 'Total', 'Status']);
}
foreach ($deleted_orders as $data) {
fputcsv($handle, [$data['ID'], $data['date'], $data['total'], $data['status']]);
}
fclose($handle);
});Проверка результата после внедрения
Чтобы убедиться, что автоматическое удаление работает:
- Создайте тестовый заказ с статусом
pendingи датой создания более 48 часов назад (можно вручную изменить дату в базе для теста). - Запустите выполнение WP-Cron вручную через плагин WP Crontrol или воспользуйтесь WP-CLI командой
wp cron event run wc_auto_delete_unpaid_orders_event. - Проверьте, что заказ удалён из админки WooCommerce.
- Откройте файл отчёта
wp-content/uploads/unpaid_orders_deletion_log.csvи убедитесь, что информация о заказе записана.
Частые ошибки и как их исправить
- Отсутствие запланированного события WP-Cron: Убедитесь, что функция
wp_schedule_eventвызывается и событие не дублируется. Проверьте с помощью плагина WP Crontrol. - Права на запись в папку uploads: Если файл отчёта не создаётся, проверьте права доступа к директории
wp-content/uploads. - Неправильное время сравнения дат: Для фильтрации по дате используйте правильный формат даты и часовой пояс сайта.
- Удаление заказов не происходит: Убедитесь, что в выборке действительно есть подходящие заказы, и что функция вызывается (проверяйте логи ошибок PHP).
Практические советы по безопасности и производительности
- Безопасность: Не выводите содержимое отчёта публично. Если нужен доступ к отчёту, организуйте его через защищённый админ-интерфейс.
- Производительность: Запускайте удаление не чаще одного раза в час, чтобы не создавать нагрузку.
- Бэкапы: Перед внедрением автоматического удаления обязательно сделайте резервную копию базы данных.
- Логирование: Храните не более нескольких последних отчётов, чтобы не переполнять дисковое пространство.
Сравнение вариантов удаления неоплаченных заказов
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Ручное удаление через админку | Простота, контроль | Затратно по времени | Подходит для небольших магазинов |
| Плагины автоматизации | Готовые решения, GUI | Могут нагружать сайт, лишний функционал | Хорошо для непрофессионалов |
| Кастомный WP-Cron с отчётом | Гибкость, прозрачность, лёгкость поддержки | Требует навыков разработки | Оптимален для опытных разработчиков |