Диагностика проблемы: зачем удалять просроченные заказы в WooCommerce
В WooCommerce накопление просроченных заказов (например, «ожидают оплату» больше 7 дней) может привести к загромождению базы данных и затруднить управление заказами. Автоматическое удаление таких заказов помогает поддерживать базу в чистоте, улучшить производительность и упростить обработку актуальных заказов.
Пошаговое решение: автоматическое удаление просроченных заказов через wp_cron
1. Добавление пользовательской функции удаления
В файл функций темы (functions.php) или в кастомный плагин добавьте следующий код. Он удалит все заказы со статусом pending, созданные более 7 дней назад.
function wc_delete_expired_pending_orders() {
$args = array(
'status' => 'pending',
'date_created' => '<' . ( time() - 7 * DAY_IN_SECONDS ),
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
}
2. Создание задачи cron для регулярного запуска
Добавьте в тот же файл код для регистрации задачи, которая будет запускаться ежедневно:
function wc_schedule_expired_order_deletion() {
if ( ! wp_next_scheduled( 'wc_delete_expired_orders_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wc_delete_expired_orders_hook' );
}
}
add_action( 'wp', 'wc_schedule_expired_order_deletion' );
add_action( 'wc_delete_expired_orders_hook', 'wc_delete_expired_pending_orders' );
3. Удаление задачи при деактивации темы или плагина
function wc_unschedule_expired_order_deletion() {
$timestamp = wp_next_scheduled( 'wc_delete_expired_orders_hook' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wc_delete_expired_orders_hook' );
}
}
register_deactivation_hook( __FILE__, 'wc_unschedule_expired_order_deletion' );
Проверка результата после внедрения
- Перейдите в WooCommerce → Заказы и отфильтруйте по статусу «Ожидает оплаты»;
- Проверьте, что заказы старше 7 дней удалены;
- Для теста можно временно изменить условие
'date_created' =< time() - 60(1 минута) и запустить функцию вручную через WP-CLI или привязать к экшену; - Логи ошибок сервера не должны содержать ошибок, связанных с функцией удаления.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что cron работает (используйте плагин WP Crontrol для отладки). Убедитесь, что функция wc_get_orders возвращает корректные заказы.
- Удаляются не те заказы: внимательно проверьте параметры фильтрации, особенно статус и дату создания. Добавьте журналирование для отладки.
- Удаление вызывает ошибки базы данных: проверьте права пользователя базы данных и наличие плагинов, которые могут блокировать удаление заказов.
- Задача cron не запускается: убедитесь, что вызов
wp_schedule_eventпроисходит на хукwpи что сайт получает трафик для срабатывания cron.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post( $order_id, true )с параметромtrueдля полного удаления без помещения в корзину; - Ограничьте выборку заказов небольшими порциями, если заказов очень много, чтобы избежать превышения лимитов памяти и времени выполнения скрипта;
- Для более надежного запуска cron можно настроить системный cron на сервере, вызывающий wp-cron.php;
- Следите за правами доступа к функциям удаления, чтобы код не запускали пользователи без соответствующих прав.
Сравнение вариантов реализации автоматического удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| WP Cron с пользовательским кодом | Гибкость, нет зависимости от плагинов, полный контроль | Зависит от посещаемости сайта, требует навыков программирования |
| Плагины автоматического удаления | Простота настройки, готовые решения | Дополнительная нагрузка, возможные конфликты, ограниченная кастомизация |
| Системный cron + WP Cron | Надежность запуска, не зависит от посещаемости | Требует доступа к серверу, настройки хостинга |