Когда и зачем нужно удалять заказы автоматически
В WooCommerce с течением времени в базе накапливаются заказы с разными статусами: отменённые, неактивные, ожидающие оплаты и т.д. Для поддержания скорости работы магазина и оптимизации базы полезно автоматически удалять заказы с определёнными статусами, например, "отменённые" или "мусорные". Это снижает нагрузку на базу данных и упрощает администрирование.
Диагностика: какие заказы можно безопасно удалить
Перед автоматическим удалением важно убедиться, что выбранные статусы действительно не нужны и не повредят учёту:
- Отменённые (cancelled) — заказы, которые пользователь отменил или администратор пометил как отменённые.
- Ожидающие оплаты (pending) — заказы, созданные, но не оплаченные. Можно удалять, если не планируется попытка оплаты.
- Возвраты (refunded) — заказы с возвратом денег. Обычно их хранят для отчётности, но при желании можно удалить.
Не удаляйте заказы со статусом completed или processing, чтобы не потерять историю продаж.
Пошаговое решение: код для автоматического удаления заказов по статусу
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:
function wc_auto_delete_orders_by_status() {
if ( ! current_user_can('manage_woocommerce') ) {
return;
}
$statuses_to_delete = array('cancelled', 'pending'); // Статусы для удаления
$days_old = 30; // Удалять заказы старше 30 дней
foreach ( $statuses_to_delete as $status ) {
$args = array(
'status' => $status,
'date_created' => '<' . ( time() - DAY_IN_SECONDS * $days_old ),
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order_id ) {
wp_trash_post( $order_id ); // Перемещаем заказ в корзину
}
}
}
// Запускаем очистку через WP-Cron ежедневно
add_action( 'wc_auto_delete_orders_daily', 'wc_auto_delete_orders_by_status' );
if ( ! wp_next_scheduled( 'wc_auto_delete_orders_daily' ) ) {
wp_schedule_event( time(), 'daily', 'wc_auto_delete_orders_daily' );
}Этот код ежедневно перемещает заказы со статусами cancelled и pending старше 30 дней в корзину (удаление из базы WordPress происходит при очистке корзины).
Как проверить работу кода
- Создайте тестовый заказ со статусом
cancelledилиpendingстарше 30 дней (можно изменить дату напрямую в базе или через плагин для редактирования заказов). - Запустите вручную задачу WP-Cron через плагин WP Crontrol или с помощью вызова функции
wc_auto_delete_orders_by_status()из консоли. - Проверьте, что заказ переместился в корзину (раздел "Корзина" в заказах WooCommerce).
- Если корзина очищена автоматически, заказ будет окончательно удалён.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что WP-Cron работает корректно. Для теста можно вызвать функцию вручную.
- Удаляются нужные заказы: внимательно проверьте список статусов в
$statuses_to_delete, не включайте активные статусы. - Не удаляются заказы старше нужного срока: проверьте параметр
$days_oldи формат даты вdate_created. - Ошибка прав доступа: функция проверяет права пользователя. Она запускается в WP-Cron, поэтому права не должны влиять. Если запускается вручную, убедитесь, что пользователь — администратор.
Советы по безопасности и производительности
- Не удаляйте заказы сразу из базы — лучше перемещать их в корзину, чтобы можно было восстановить при ошибке.
- Оптимизируйте количество обрабатываемых заказов за один запуск, чтобы не нагружать сервер.
- Регулярно делайте резервные копии базы перед внедрением автоматических удалений.
- Для масштабных магазинов с тысячами заказов используйте WP-CLI для пакетного удаления с контролем.
Сравнение методов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron с кодом в functions.php | Автоматизация, гибкость, бесплатный | Зависит от работы WP-Cron, нагрузка на сайт |
| Плагины для управления заказами (например, Bulk Delete) | Простой интерфейс, удобство | Может перегружать сайт, меньше контроля |
| WP-CLI скрипты | Высокая производительность, контроль, подходит для больших магазинов | Требует доступа по SSH, знания командной строки |