Диагностика проблемы с не оплаченными заказами в WooCommerce
В WooCommerce часто накапливаются заказы со статусом pending или failed, которые не были оплачены или завершены. Это забивает базу данных, усложняет администрирование и может замедлять работу сайта. Пользователи жалуются, что накапливаются десятки и сотни таких заказов, а стандартных настроек в WooCommerce для их автоматического удаления нет.
Проверить наличие таких заказов просто: зайдите в админку WooCommerce — Заказы и отфильтруйте по статусу Ожидает оплаты. Если их много и они старше нескольких дней, проблему надо решать.
Пошаговое решение: Автоматическое удаление заказов по времени
1. Создайте функцию удаления
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
function wc_delete_unpaid_orders() {
$args = array(
'status' => array('pending', 'failed'),
'date_created' => '<' . ( time() - DAY_IN_SECONDS * 3 ), // старше 3 дней
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
$order = wc_get_order($order_id);
if ($order) {
$order->delete(true); // true - принудительное удаление
}
}
}2. Запустите функцию по расписанию с WP-Cron
Добавьте в functions.php следующий код для регистрации события и запуска раз в сутки:
function wc_schedule_delete_unpaid_orders() {
if (!wp_next_scheduled('wc_delete_unpaid_orders_daily')) {
wp_schedule_event(time(), 'daily', 'wc_delete_unpaid_orders_daily');
}
}
add_action('wp', 'wc_schedule_delete_unpaid_orders');
add_action('wc_delete_unpaid_orders_daily', 'wc_delete_unpaid_orders');3. Проверка результата после внедрения
- После добавления кода подождите 24 часа (или вызовите вручную
wc_delete_unpaid_orders()из консоли WP-CLI или временно добавьте вызов функции вinitдля теста). - Зайдите в админку WooCommerce — Заказы, отфильтруйте статусы
pendingиfailed— заказы старше 3 дней должны быть удалены. - Проверьте таблицу
wp_posts, гдеpost_type = 'shop_order', чтобы убедиться, что старые заказы удалены.
Частые ошибки и как их исправить
- Не удаляются заказы: Проверьте, что функция действительно запускается (можно добавить
error_logвнутри функции). - Заказы не старше 3 дней удаляются: Скорее всего, ошибка в вычислении времени. Используйте
current_time('timestamp')вместоtime()для корректного часового пояса сервера WordPress. - Удаляются только
pending, но неfailed: Проверьте, что в массиве статусов прописаны оба значения. - Удаление ломает отчёты или интеграции: Лучше сначала не удалять, а переводить заказы в кастомный статус и отслеживать последствия.
Практические советы по безопасности и производительности
- Перед удалением заказов сделайте резервную копию базы данных.
- Запускать удаление раз в сутки — оптимально, чтобы не нагружать сервер.
- Если на сайте много заказов, ограничьте выборку, например,
'limit' => 50и запускайте WP-Cron чаще. - В продакшене лучше реализовать удаление через системный cron, а не WP-Cron, чтобы не зависеть от посещаемости сайта.
- Всегда проверяйте, что удалённые заказы действительно не нужны — можно добавить резервное хранение через экспорт CSV перед удалением.
Сравнение вариантов реализации удаления заказов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код в functions.php + WP-Cron | Простая реализация через функцию и WP-Cron | Быстро, без плагинов | WP-Cron зависит от посещаемости сайта |
| Плагин очистки заказов | Использование специализированных плагинов (например, WooCommerce Order Cleanup) | Интерфейс, настройки | Дополнительная нагрузка, зависимости |
| Системный cron + WP-CLI | Удаление заказов через скрипт WP-CLI по системному cron | Надежно, производительно | Требует доступа к серверу, навыков работы с консолью |