Диагностика проблемы: зачем удалять неоплаченные заказы
В WooCommerce неоплаченные заказы (статус "pending" или "failed") могут накапливаться, занимая место в базе и усложняя работу с заказами. Особенно это актуально для магазинов с большим трафиком и частыми брошенными корзинами. Автоматическое удаление таких заказов помогает поддерживать базу данных в порядке и улучшить производительность.
Как определить, какие заказы подлежат удалению
Для чистки важно точно определить статус и возраст заказа. Обычно удаляют заказы со статусами pending, failed или cancelled, которые не были обновлены за определённое количество дней.
- Статус заказа —
pending(ожидает оплаты),failed(оплата не прошла), иногдаcancelled. - Возраст заказа — например, старше 7 дней.
Пошаговое решение: автоматическое удаление заказов через WP-Cron
Реализуем регулярную задачу, которая будет запускаться ежедневно и удалять неоплаченные заказы старше заданного срока.
1. Создаем функцию для удаления заказов
function wplist_delete_old_unpaid_orders() {
$days = 7; // Количество дней для хранения неоплаченных заказов
$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_delete_post($order_id, true); // Удаляем заказ без перемещения в корзину
}
}
2. Регистрируем событие WP-Cron для ежедневного запуска
function wplist_schedule_delete_old_orders() {
if (!wp_next_scheduled('wplist_daily_delete_unpaid_orders')) {
wp_schedule_event(time(), 'daily', 'wplist_daily_delete_unpaid_orders');
}
}
add_action('wp', 'wplist_schedule_delete_old_orders');
add_action('wplist_daily_delete_unpaid_orders', 'wplist_delete_old_unpaid_orders');
3. Отключение задачи при деактивации плагина (если код в плагине)
function wplist_clear_scheduled_delete_old_orders() {
$timestamp = wp_next_scheduled('wplist_daily_delete_unpaid_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wplist_daily_delete_unpaid_orders');
}
}
register_deactivation_hook(__FILE__, 'wplist_clear_scheduled_delete_old_orders');
Проверка результата после внедрения
- Запустите функцию вручную для теста:
wplist_delete_old_unpaid_orders();через консоль WP-CLI или временно вызвав её из админки. - Проверьте список заказов в WooCommerce — старые неоплаченные должны исчезнуть.
- Проверьте логи сервера или включите WP_DEBUG для отлова ошибок.
- Убедитесь, что WP-Cron работает: можно использовать плагин WP Crontrol для мониторинга и запуска событий.
Частые ошибки и как их исправить
- WP-Cron не запускается: если сайт не получает трафик, cron-задачи не выполняются. Решение — настроить системный cron на сервере для вызова
wp-cron.php. - Удаление не происходит: проверьте правильность статусов и даты в запросе. Можно вывести
$ordersперед удалением для отладки. - Удаляются нужные заказы: убедитесь, что фильтр по статусу и дате корректен, не используйте слишком большие значения.
- Память или время выполнения превышены: для большого количества заказов разбейте удаление на партии или используйте WP-CLI скрипт.
Практические советы по безопасности и производительности
- Всегда создавайте резервную копию базы перед внедрением автоматического удаления.
- Ограничивайте количество удаляемых за раз, если заказов очень много.
- Для критичных магазинов используйте WP-CLI скрипты с возможностью ручного запуска и логированием.
- При необходимости интегрируйте оповещения по email о выполнении задачи.
- Для мониторинга и управления cron-задачами используйте плагин WP Crontrol.
Сравнение вариантов реализации удаления неоплаченных заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron с хуками | Простая реализация, не требует внешних настроек | Зависит от трафика сайта, возможны задержки |
| Системный cron + WP-CLI | Надежно, работает по расписанию без зависимости от трафика | Требует доступа к серверу и знания CLI |
| Плагины очистки заказов | Готовые решения с интерфейсом и настройками | Могут быть избыточными, нагружают сайт |