Диагностика проблемы: зачем удалять неоплаченные заказы
В интернет-магазинах на WooCommerce накапливаются неоплаченные заказы, которые занимают место в админке и базе данных. Они могут создавать путаницу, замедлять отчёты и влиять на аналитику. Удаление таких заказов через определённое время после создания помогает поддерживать базу в чистоте и улучшать производительность.
Как настроить автоматическое удаление неоплаченных заказов
Пояснение: что считаются неоплаченными заказами
Заказы со статусом pending (ожидает оплаты) или failed (неудачная оплата) считаются неоплаченными. Иногда в магазинах встречается статус on-hold, но его стоит рассматривать отдельно в зависимости от бизнес-логики.
Реализация: планировщик WP-Cron и кастомная функция удаления
Добавим в файл functions.php или в кастомный плагин следующий код, который будет запускаться ежедневно и удалять заказы старше заданного количества дней.
<?php
// Интервал для WP-Cron: раз в сутки
add_filter('cron_schedules', function($schedules) {
if (!isset($schedules['daily_custom'])) {
$schedules['daily_custom'] = [
'interval' => 86400, // 24 часа
'display' => __('Раз в сутки')
];
}
return $schedules;
});
// Планируем задачу, если ещё не запланирована
if (!wp_next_scheduled('delete_old_unpaid_orders')) {
wp_schedule_event(time(), 'daily_custom', 'delete_old_unpaid_orders');
}
// Функция удаления заказов
add_action('delete_old_unpaid_orders', function() {
$days_to_keep = 7; // удалить заказы старше 7 дней
$date = date('Y-m-d H:i:s', strtotime("-{$days_to_keep} days"));
$args = [
'status' => ['pending', 'failed'],
'date_created' => '<' . $date,
'limit' => -1,
'return' => 'ids',
];
$orders = wc_get_orders($args);
if (empty($orders)) {
return;
}
foreach ($orders as $order_id) {
wp_trash_post($order_id); // Перемещаем заказ в корзину
// Или wp_delete_post($order_id, true); для полного удаления
}
});
// Очистка задачи при деактивации плагина
register_deactivation_hook(__FILE__, function() {
wp_clear_scheduled_hook('delete_old_unpaid_orders');
});
?>
Проверка результата после внедрения
- Убедитесь, что планировщик запущен — в админке плагинов для WP-Cron или с помощью плагина Clearfy (есть инструмент диагностики Cron).
- Создайте тестовый заказ со статусом
pendingи выставьте дату создания более 7 дней назад (можно сделать через phpMyAdmin). - Запустите Cron вручную или дождитесь автоматического запуска, затем проверьте, что заказ переместился в корзину или удалён.
- Проверьте логи сервера и ошибок, чтобы убедиться в отсутствии сбоев.
Частые ошибки и как их исправить
- WP-Cron не запускается: часто из-за низкой посещаемости сайта. Решение — настроить системный cron на сервере для вызова wp-cron.php, либо использовать плагин для управления cron.
- Заказы не удаляются: проверьте правильность статусов и формата даты в запросе
wc_get_orders. Статусы должны быть корректными (например,pendingвместоprocessing). - Удаление заказов приводит к потере данных: используйте сначала
wp_trash_post, чтобы можно было восстановить заказ из корзины в админке. - Не учитывается часовой пояс: дата сравнения должна учитывать часовой пояс WordPress (используйте
current_time('mysql')вместоdate(), если нужно).
Практические советы по безопасности и производительности
- Устанавливайте лимит на количество удаляемых заказов за один запуск, чтобы избежать таймаутов. Например, добавить
'limit' => 100в параметры запроса. - Логируйте удалённые заказы — полезно для аудита и отката. Пример: записывать ID и дату удаления в отдельный лог-файл.
- Регулярно делайте бэкапы базы, особенно перед внедрением автоматического удаления.
- Используйте Clearfy Pro для мониторинга и оптимизации WooCommerce, если хотите готовое решение с поддержкой.
Сравнение подходов удаления неоплаченных заказов
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| WP-Cron + кастомный код | Гибкость, полный контроль, бесплатно | Зависит от корректной работы WP-Cron, требует навыков разработчика | Добавить логирование и лимиты для безопасности |
| Плагины для чистки WooCommerce | Простота настройки, интерфейс | Могут быть платными, ограничены в настройках | Использование вместе с кастомным кодом для особых случаев |
| Ручная очистка через админку | Простая и безопасная | Неэффективно при большом количестве заказов | Использовать для выборочной очистки |