Диагностика проблемы: зачем нужно удалять просроченные заказы в WooCommerce
В интернет-магазине на WooCommerce могут накапливаться заказы, которые не были оплачены или обработаны в течение длительного времени. Такие заказы занимают место в базе данных, замедляют работу административной панели и усложняют аналитику. Особенно актуально это для магазинов с большим количеством заказов и ограниченным хостингом.
Стандартного функционала для автоматического удаления просроченных заказов в WooCommerce нет. Обычно администраторы удаляют такие заказы вручную, что неудобно и подвержено ошибкам.
Пошаговое решение: автоматизация удаления заказов через WP-Cron и PHP
1. Определение критериев просроченного заказа
Для удаления будем считать просроченными заказы со статусом pending или failed, которые созданы более 7 дней назад. Параметры можно изменить под свои нужды.
2. Создание функции для удаления заказов
function wpset_delete_expired_orders() {
$days = 7; // количество дней для просрочки
$date_before = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = array(
'limit' => -1,
'status' => array('pending', 'failed'),
'date_created' => '<' . $date_before,
'return' => 'ids',
);
$orders = wc_get_orders($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // удаляем навсегда
}
}
}3. Регистрация задачи в WP-Cron
Добавим событие, которое будет запускать функцию ежедневно.
function wpset_schedule_delete_expired_orders() {
if (!wp_next_scheduled('wpset_daily_delete_expired_orders')) {
wp_schedule_event(time(), 'daily', 'wpset_daily_delete_expired_orders');
}
}
add_action('wp', 'wpset_schedule_delete_expired_orders');
add_action('wpset_daily_delete_expired_orders', 'wpset_delete_expired_orders');4. Отмена задачи при деактивации темы или плагина
function wpset_clear_scheduled_delete() {
$timestamp = wp_next_scheduled('wpset_daily_delete_expired_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpset_daily_delete_expired_orders');
}
}
register_deactivation_hook(__FILE__, 'wpset_clear_scheduled_delete');Проверка результата после внедрения
- Создайте тестовый заказ со статусом
pending, выставьте дату создания старше 7 дней (можно вручную в базе или через код). - Запустите функцию вручную или дождитесь запуска WP-Cron (обычно ночью).
- Проверьте, что заказ удалён из панели WooCommerce и из базы данных (таблица
wp_postsс типомshop_order). - Для отладки можно временно добавить логирование в файл через
error_log.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что WP-Cron работает. Для этого можно установить плагин WP Crontrol и посмотреть запланированные задачи.
- Удаление не навсегда: убедитесь, что
wp_delete_postвызывается с параметромtrue, иначе заказы попадут в корзину, а не будут удалены. - Функция вызывается слишком часто: используйте только одно запланированное событие в сутки, чтобы не перегружать сервер.
- Проблемы с правами: убедитесь, что пользователь, под которым выполняется код, имеет права на удаление заказов.
Практические советы по безопасности и производительности
- Не удаляйте заказы со статусами
processingилиcompleted— это реальные покупки. - Перед удалением можно сделать резервное копирование базы данных или экспорт заказов.
- Если заказов много, разбивайте удаление на части, чтобы избежать таймаутов. Например, использовать
limitи обрабатывать по 50 заказов за раз. - Для ускорения запросов используйте индексы по дате создания и статусу в базе данных.
Сравнение способов автоматического удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин (например, WP Bulk Delete) | Простой интерфейс, готовые настройки | Может перегружать сайт, лишний плагин |
| Код с WP-Cron (как описано выше) | Лёгкий, полностью контролируемый, без лишних плагинов | Требует навыков программирования, настройка WP-Cron |
| Ручное удаление | Полный контроль, без риска автоматических ошибок | Трудоёмко, легко забыть удалить |