Диагностика проблемы: зачем удалять неоплаченные заказы
В интернет-магазинах на WooCommerce нередко накапливаются заказы в статусах «ожидает оплаты» или «отложен». Это создает лишнюю нагрузку на базу данных и усложняет управление заказами. Особенно остро проблема стоит, если магазин принимает платежи с задержкой или через сторонние сервисы, что приводит к длительному хранению «висящих» заказов.
Чтобы избежать загромождения, важно настроить автоматическое удаление таких заказов по истечении заданного времени. Ручная очистка неудобна, а стандартного функционала WooCommerce для этого нет.
Как проверить, что проблема существует
- Перейдите в WooCommerce → Заказы и отфильтруйте по статусам
on-holdиpending. - Посмотрите на количество заказов, которые не меняли статус более 7-14 дней.
- Оцените нагрузку на базу данных и скорость отклика сайта.
Если таких заказов более сотни, стоит подумать об их автоматическом удалении.
Пошаговое решение: удаление заказов по статусу через WP-Cron
1. Добавляем пользовательскую функцию очистки
Создадим функцию, которая будет удалять заказы со статусом pending или on-hold, которым больше заданного количества дней:
function wplike_delete_old_unpaid_orders() {
$days = 14; // Удаляем заказы старше 14 дней
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-pending', 'wc-on-hold'),
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date,
),
),
'fields' => 'ids',
'posts_per_page' => -1,
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_trash_post($order_id); // Лучше сначала в корзину
}
}
}2. Регистрируем WP-Cron задачу
Добавим ежедневное выполнение через cron:
function wplike_schedule_daily_order_cleanup() {
if (!wp_next_scheduled('wplike_daily_order_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'wplike_daily_order_cleanup_hook');
}
}
add_action('wp', 'wplike_schedule_daily_order_cleanup');
add_action('wplike_daily_order_cleanup_hook', 'wplike_delete_old_unpaid_orders');3. Очистка по расписанию и ручной запуск
Для тестирования можно вызвать функцию вручную через админский файл или WP-CLI:
wp eval 'wplike_delete_old_unpaid_orders();'Проверка результата после внедрения
- Проверьте список заказов в админке WooCommerce → Заказы — заказы старше 14 дней в статусах
pendingиon-holdдолжны пропасть. - Проверьте логи WP-Cron (например, с помощью плагина WP Crontrol), чтобы убедиться, что задача выполняется раз в сутки.
- Убедитесь, что новые заказы не удаляются преждевременно.
Частые ошибки и как исправить
- Заказы не удаляются: проверьте, что WP-Cron работает. На хостингах с низкой посещаемостью cron может не запускаться — настройте системный cron или вызов wp-cron.php по расписанию.
- Удаляются заказы, которые еще актуальны: проверьте значение переменной
$daysи фильтры статусов. Чтобы избежать потери данных, лучше сначала отправлять заказы в корзину, а не удалять сразу. - Повышенная нагрузка при удалении большого числа заказов: добавьте ограничение на количество удаляемых заказов за один запуск, например,
posts_per_page => 100, и запускайте cron чаще.
Практические советы по безопасности и производительности
- Всегда используйте
wp_trash_post(), чтобы оставить возможность восстановления заказа. - Добавьте логи удаления – записывайте ID удаленных заказов в отдельный лог-файл или таблицу для аудита.
- Проводите очистку в ночное время, чтобы минимизировать влияние на работу сайта.
- Для крупных магазинов с десятками тысяч заказов рассмотрите использование WP-CLI для пакетного удаления заказов без нагрузки на веб-сервер.
- Перед внедрением сделайте резервную копию базы данных.
Таблица сравнения подходов удаления заказов
| Метод | Плюсы | Минусы | Пример кода |
|---|---|---|---|
| Удаление через WP-Cron (автоматически) | Автоматизация, минимальное вмешательство | Зависит от работы WP-Cron, возможна нагрузка при большом объеме | wp_schedule_event + wp_trash_post() |
| Ручное удаление в админке | Полный контроль, безопасно | Трудозатратно, не подходит для больших объемов | Через интерфейс WooCommerce |
| Использование плагинов (например, Clearfy Pro) | Готовые решения, удобный интерфейс | Плагины могут быть платными, лишний код на сайте | Настройки в плагине |