Почему нужно автоматически удалять просроченные заказы в WooCommerce
В интернет-магазинах на WooCommerce заказы со статусом, например, "ожидает оплаты" или "отменён", которые долго не меняются, могут засорять базу. Это замедляет запросы и усложняет администрирование. Автоматическое удаление таких заказов позволяет поддерживать базу данных в оптимальном состоянии без ручного вмешательства.
Диагностика проблемы: как определить устаревшие заказы
Чтобы решить задачу, нужно чётко определить критерии "просроченности" заказов. Обычно это заказы со статусом pending, failed или cancelled, созданные более N дней назад. Проверить их можно SQL-запросом:
SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-cancelled') AND post_date < DATE_SUB(NOW(), INTERVAL 7 DAY);Замените 7 на нужное количество дней. Если таких заказов много, стоит автоматизировать их удаление.
Пошаговое решение: создание WP-Cron задачи для удаления заказов
1. Добавляем функцию удаления заказов
Функция получает список заказов с нужными статусами и датой, затем последовательно удаляет их:
function wc_delete_expired_orders() {
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-pending', 'wc-failed', 'wc-cancelled'),
'date_query' => array(
array(
'column' => 'post_date',
'before' => '7 days ago', // Можно настроить
),
),
'posts_per_page' => -1,
'fields' => 'ids',
'no_found_rows' => true,
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true - принудительное удаление
}
}
}2. Регистрируем крон-задачу при активации темы или плагина
function wc_schedule_expired_orders_cleanup() {
if (!wp_next_scheduled('wc_cleanup_expired_orders_hook')) {
wp_schedule_event(time(), 'daily', 'wc_cleanup_expired_orders_hook');
}
}
add_action('wp', 'wc_schedule_expired_orders_cleanup');3. Привязываем нашу функцию к крон-событию
add_action('wc_cleanup_expired_orders_hook', 'wc_delete_expired_orders');4. Очистка при деактивации (если это плагин)
function wc_clear_expired_orders_cleanup() {
$timestamp = wp_next_scheduled('wc_cleanup_expired_orders_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wc_cleanup_expired_orders_hook');
}
}Как проверить, что автоматическое удаление работает
- Создайте тестовый заказ со статусом
pendingи датой более 7 дней назад (можно вручную в базе или через WP-CLI). - Выполните крон-задачу вручную через WP-CLI:
wp cron event run wc_cleanup_expired_orders_hook. - Проверьте, что заказ удалён: в админке WooCommerce или через SQL-запрос.
- Следите за логами сервера — ошибок быть не должно.
Частые ошибки и пути их исправления
- Заказы не удаляются: проверьте, что статус заказа корректно указан с префиксом
wc-(например,wc-pending), иначе get_posts ничего не найдёт. - Крон-задача не запускается: убедитесь, что в WordPress работает WP-Cron (например, вызов wp-cron.php не заблокирован). Для отладки используйте плагин WP Crontrol.
- Удаляются лишние заказы: перепроверьте параметры
date_queryи статусы, чтобы не потерять важные данные. - Перегрузка сервера при большом количестве заказов: добавьте ограничение по количеству удаляемых заказов за один запуск, например,
'posts_per_page' => 100, и используйте пагинацию.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post($order_id, true)для полного удаления, включая метаданные. - Избегайте частых запусков крон-задачи — достаточно раз в сутки.
- Для больших магазинов рассмотрите пакетную обработку заказов с хранением прогресса в опциях.
- При необходимости логируйте удалённые ID заказов для аудита.
Сравнение вариантов удаления просроченных заказов
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Ручное удаление через админку | Простота | Трудозатратно, риск ошибки | Малые объёмы заказов |
| SQL-запросы напрямую | Быстро | Риск повредить данные, требует бэкапа | Опытные разработчики |
| WP-Cron с wp_delete_post() | Автоматизация, безопасно | Зависит от WP-Cron | Средние и крупные магазины |
| Плагины очистки базы | Удобство, дополнительные функции | Зависимость от стороннего ПО | Желающие минимизировать код |