Почему нужно удалять заказы WooCommerce по статусу
В интернет-магазинах на WooCommerce со временем накапливаются заказы с разными статусами — отменённые, проваленные, в ожидании оплаты. Многие из них не несут ценности и только замусоривают базу данных, замедляя работу сайта и усложняя аналитику. Автоматическое удаление таких заказов помогает поддерживать базу в порядке без ручной чистки.
Диагностика: как понять, что стоит удалить заказы
Перед автоматизацией важно определить, какие именно заказы нужно удалять:
- Отмена или провал оплаты: заказы со статусами
cancelled,failed - В ожидании оплаты слишком долго: статус
pendingилиon-holdболее 30 дней
Для диагностики используйте запросы к базе или плагины аналитики WooCommerce, чтобы посмотреть статистику заказов по статусам и датам.
Пошаговое решение: код для автоматического удаления заказов по статусу
Мы настроим WP-Cron задачу, которая будет запускаться раз в сутки и удалять все заказы старше 30 дней по указанным статусам.
1. Добавляем функцию удаления заказов
function wpbe_delete_old_wc_orders() {
// Статусы заказов для удаления
$statuses = array('cancelled', 'failed', 'pending');
// Дата 30 дней назад
$date = date('Y-m-d H:i:s', strtotime('-30 days'));
foreach ($statuses as $status) {
$args = array(
'limit' => -1,
'status' => $status,
'date_created' => '<'.$date,
'return' => 'ids',
);
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
$order = wc_get_order($order_id);
// Удаляем заказ
wp_delete_post($order_id, true);
}
}
}2. Регистрируем WP-Cron событие
if (!wp_next_scheduled('wpbe_daily_delete_old_orders')) {
wp_schedule_event(time(), 'daily', 'wpbe_daily_delete_old_orders');
}
add_action('wpbe_daily_delete_old_orders', 'wpbe_delete_old_wc_orders');3. Очистка при деактивации темы/плагина
function wpbe_clear_scheduled_delete() {
$timestamp = wp_next_scheduled('wpbe_daily_delete_old_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpbe_daily_delete_old_orders');
}
}
register_deactivation_hook(__FILE__, 'wpbe_clear_scheduled_delete');Как проверить, что удаление работает
- Проверьте наличие старых заказов с выбранными статусами в админке WooCommerce > Заказы.
- Запустите функцию вручную, вызвав
wpbe_delete_old_wc_orders()через WP-CLI или подключив её к кнопке в админке. - После запуска проверьте, что заказы удалены из базы (проверьте таблицу
wp_postsс типомshop_order). - Убедитесь, что в cron задачах (через плагин WP Crontrol) есть событие
wpbe_daily_delete_old_orders.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что функция вызывается и что у пользователя/процесса есть права на удаление записей.
- Удаляются не те заказы: проверьте корректность статусов в массиве и дату фильтрации.
- Нагрузка на сервер при массовом удалении: если заказов много, разбейте удаление на части с пагинацией и используйте транзакции.
- Функция не запускается по cron: проверьте, активен ли wp-cron, нет ли конфликтов с плагинами безопасности.
Практические советы по безопасности и производительности
- Перед удалением сделайте резервную копию базы данных.
- Внедряйте удаление только для заказов старше 30 дней — так минимизируете риск удаления нужных данных.
- Для больших магазинов оптимизируйте выборку заказов с помощью прямых SQL-запросов с лимитом и индексами.
- Используйте сторонние инструменты, такие как WPShop Clearfy Pro, чтобы управлять очисткой базы и кроном более гибко.
Сравнение способов автоматического удаления заказов WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Код через WP-Cron (как в статье) | Гибкая настройка, без плагинов, можно кастомизировать | Требует навыков, возможна нагрузка при больших объемах |
| Плагин для очистки базы (например, WP Sweep) | Простота использования, готовые функции очистки | Меньше контроля, риск удаления ненужных данных |
| Ручное удаление через админку WooCommerce | Безопасно, интуитивно | Не подходит для больших объемов, требует времени |