Диагностика задачи: зачем и когда удалять отменённые и возвращённые заказы в WooCommerce
Магазины на WooCommerce часто сталкиваются с накоплением большого числа заказов со статусами cancelled (отменён) и refunded (возврат). Такие заказы не несут коммерческой ценности, но занимают место в базе данных, замедляют админку и усложняют отчёты. Особенно это заметно при большом потоке заказов и ограниченных ресурсах хостинга.
Удаление таких заказов вручную — трудоёмкий и неэффективный процесс. Автоматизация через WP-Cron позволит систематически чистить базу и держать WooCommerce в оптимальном состоянии.
Пошаговое решение: автоматическое удаление заказов по статусу через WP-Cron
1. Создание пользовательской функции удаления заказов
Добавьте следующий код в файл functions.php вашей дочерней темы или в плагин функционала:
function wpmentor_delete_cancelled_refunded_orders() {
// Получаем заказы со статусом cancelled и refunded старше 7 дней
$args = array(
'status' => array('cancelled', 'refunded'),
'date_created' => '<' . ( time() - 7 * DAY_IN_SECONDS ),
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders($args);
if(empty($orders)) {
return;
}
foreach($orders as $order_id) {
wp_delete_post($order_id, true); // Полное удаление без перемещения в корзину
}
}2. Регистрация WP-Cron задачи для автоматического запуска
Добавьте в тот же файл код, который создаст задачу для запуска функции раз в сутки:
function wpmentor_schedule_order_cleanup() {
if (!wp_next_scheduled('wpmentor_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpmentor_daily_order_cleanup');
}
}
add_action('wp', 'wpmentor_schedule_order_cleanup');
add_action('wpmentor_daily_order_cleanup', 'wpmentor_delete_cancelled_refunded_orders');3. Удаление задачи при деактивации (рекомендуется)
Чтобы избежать утечек задач, добавьте в ваш плагин или файл функций следующий код для удаления WP-Cron при деактивации:
function wpmentor_clear_scheduled_order_cleanup() {
$timestamp = wp_next_scheduled('wpmentor_daily_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpmentor_daily_order_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wpmentor_clear_scheduled_order_cleanup');Проверка результата после внедрения
- В админке WooCommerce перейдите в раздел Заказы и отфильтруйте по статусам
ОтменёниВозврат. Убедитесь, что заказы старше 7 дней исчезают автоматически после запуска WP-Cron (обычно в течение суток). - Для ускоренного тестирования временно измените условие
date_createdв функции на 1 день или меньше и вручную вызовите функцию черезdo_action('wpmentor_daily_order_cleanup')вfunctions.php. - Проверьте логи сервера на наличие ошибок удаления (если используется WP_DEBUG).
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что WP-Cron работает на вашем хостинге (в некоторых случаях нужно настроить системный cron или использовать сторонний сервис).
- Удаляются все заказы без фильтрации по дате: Убедитесь, что параметр
'date_created' => '<' . ( time() - 7 * DAY_IN_SECONDS )корректно передаётся и возвращает ожидаемые результаты. - Ошибка «функция wc_get_orders не найдена»: Убедитесь, что код выполняется в контексте WooCommerce (например, подключайте код через хуки после загрузки плагина WooCommerce).
- Заказы остаются в корзине, но не отображаются в админке: Используйте
wp_delete_post($order_id, true)с параметромtrueдля полного удаления без перемещения в корзину.
Практические советы по безопасности и производительности
- Всегда делайте резервные копии базы данных перед автоматическим удалением заказов.
- Чтобы избежать нагрузки на сервер, ограничьте количество удаляемых заказов за один запуск (например,
'limit' => 50), и запускайте WP-Cron чаще, например, каждые 6 часов. - Следите, чтобы код работал только в административной части и не влиял на фронтенд, чтобы не снижать производительность сайта для обычных пользователей.
- Для более продвинутой очистки можно добавить логи удаления заказов с указанием ID и времени удаления, чтобы контролировать процесс.
Сравнение способов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление в админке WooCommerce | Просто, не требует кода | Трудоёмко, не подходит для большого количества заказов |
| Автоматизация через WP-Cron и код (описано выше) | Полностью автоматизировано, гибко настраивается | Требует базовых знаний PHP и понимания WP-Cron |
| Плагины для очистки заказов | Удобный интерфейс, дополнительные функции | Может влиять на производительность, зависит от стороннего кода |