Диагностика проблемы с неоплаченными заказами в WooCommerce
В WooCommerce неоплаченные заказы накапливаются, если покупатели не завершили оплату или отказались от покупки. Это приводит к загромождению базы данных, замедлению запросов и усложнению управления заказами. Частая ситуация — неоплаченные заказы остаются в базе без срока удаления по умолчанию.
Чтобы проверить текущий статус заказов, зайдите в админку WooCommerce → Заказы и выберите фильтр по статусу Ожидает оплаты или В ожидании. Обратите внимание на количество таких заказов и дату их создания.
Пошаговое решение: автоматическое удаление старых неоплаченных заказов через код
1. Создаем функцию для удаления заказов старше определенного времени
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин. Он удалит все заказы со статусом pending или failed, созданные более 3 дней назад.
function wprus_delete_old_unpaid_orders() {
$days = 3; // количество дней, старше которых заказы удаляются
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = array(
'limit' => -1,
'status' => array('pending', 'failed'),
'date_created' => '<' . $date,
'return' => 'ids',
);
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
wp_trash_post($order_id); // можно заменить на wp_delete_post($order_id, true) для полного удаления
}
}
// Запускаем функцию ежедневно через WP-Cron
add_action('wprus_daily_delete_old_unpaid_orders', 'wprus_delete_old_unpaid_orders');
// Регистрируем событие при активации темы или плагина
if (! wp_next_scheduled('wprus_daily_delete_old_unpaid_orders')) {
wp_schedule_event(time(), 'daily', 'wprus_daily_delete_old_unpaid_orders');
}2. Настройка времени удаления и статусов заказов
В коде вы можете изменить переменную $days для установки другого порога по времени. Например, 7 для недели или 1 для суток. Также можно добавить или убрать статусы заказов в массиве 'status' => array().
3. Исключение определенных заказов из удаления
Чтобы не удалять заказы с определенными метками или товарами, расширьте логику внутри цикла:
foreach ($orders as $order_id) {
$order = wc_get_order($order_id);
// Пример исключения заказов с товаром ID 123
$items = $order->get_items();
$exclude = false;
foreach ($items as $item) {
if ($item->get_product_id() == 123) {
$exclude = true;
break;
}
}
if (! $exclude) {
wp_trash_post($order_id);
}
}Проверка результата после внедрения
После добавления кода:
- Запустите вручную функцию через
do_action('wprus_daily_delete_old_unpaid_orders');в консоли WP или временно добавьте вызов вfunctions.php, чтобы проверить удаление. - Проверьте раздел Заказы в WooCommerce: старые неоплаченные заказы должны быть перемещены в корзину (или удалены).
- Проверьте таблицу
wp_postsв базе данных — заказы с типомshop_orderи статусомtrashили удаленные записи должны отсутствовать, если используется полное удаление.
Через сутки или при следующем запуске WP-Cron функция будет запускаться автоматически.
Частые ошибки и их исправление
- Крон не запускается: Проверьте, что на сайте активен WP-Cron. Для теста вызовите
do_action('wprus_daily_delete_old_unpaid_orders');вручную. - Заказы не удаляются: Убедитесь, что статусы заказов указаны правильно (
pending,failedи т.д.). Проверьте формат даты$date. - Удаляются нужные заказы: Добавьте проверку исключений (например, по товарам или меткам) перед удалением.
- Ошибка доступа к функциям WooCommerce: Убедитесь, что WooCommerce активен и код запускается после его загрузки (например, в хук
woocommerce_init).
Практические советы по производительности и безопасности
- Используйте пакетное удаление: Если заказов много, делайте выборку и удаление партиями, чтобы избежать тайм-аутов.
- Резервные копии базы: Перед массовым удалением делайте резервную копию базы данных.
- Логирование: Добавьте логирование удаленных заказов в отдельный файл для аудита.
- Ручной запуск: Реализуйте кнопку в админке для запуска очистки вручную с подтверждением.
- Проверяйте WP-Cron: Для сайтов с низким трафиком используйте системный cron вместо WP-Cron для надежности.
Сравнение способов удаления старых неоплаченных заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Код с WP-Cron (как в статье) | Полный контроль, гибкость, бесплатно | Нужно писать и тестировать; завязка на WP-Cron |
| Плагины очистки заказов (например, WooCommerce Order Cleaner) | Простота настройки, готовые функциональности | Может быть избыточным; зависимость от стороннего кода |
| Ручное удаление через админку | Простота, не требует кода | Трудозатратно, ошибочно можно удалить нужные заказы |