Диагностика проблемы: зачем и когда нужно удалять заказы автоматически
В WooCommerce накапливается большое количество заказов, особенно со статусами, которые больше не актуальны, например, отменённые или просроченные. Это замедляет работу базы данных, увеличивает время резервного копирования и затрудняет администрирование. Ручное удаление заказов — неэффективно, особенно если нужно очистить заказы старше определённой даты.
Основная задача — настроить автоматическое удаление заказов по заданным статусам и дате создания, чтобы поддерживать базу в оптимальном состоянии.
Как реализовать автоматическое удаление заказов WooCommerce по статусу и дате
Шаг 1. Создаём функцию для удаления заказов
Для начала напишем функцию, которая будет получать заказы по статусу и дате, и удалять их программно через WP_Query и методы WooCommerce.
function wpcontrol_delete_old_orders( $statuses = array('cancelled', 'failed'), $days_ago = 30 ) {
if ( ! function_exists('wc_get_orders') ) {
return;
}
// Дата - заказы старше $days_ago дней
$date = date( 'Y-m-d H:i:s', strtotime( "-{$days_ago} days" ) );
$args = array(
'limit' => -1,
'status' => $statuses,
'date_created' => '<' . $date,
'return' => 'ids',
);
$order_ids = wc_get_orders( $args );
foreach ( $order_ids as $order_id ) {
$order = wc_get_order( $order_id );
if ( $order ) {
$order->delete( true ); // удаляем навсегда
}
}
}Шаг 2. Запускаем функцию по расписанию через WP-Cron
Чтобы функция выполнялась регулярно, например, раз в неделю, зарегистрируем кастомное событие и повесим на него удаление.
add_action( 'wpcontrol_weekly_order_cleanup', 'wpcontrol_delete_old_orders' );
function wpcontrol_schedule_order_cleanup() {
if ( ! wp_next_scheduled( 'wpcontrol_weekly_order_cleanup' ) ) {
wp_schedule_event( time(), 'weekly', 'wpcontrol_weekly_order_cleanup' );
}
}
add_action( 'wp', 'wpcontrol_schedule_order_cleanup' );Шаг 3. Настройка параметров удаления
Вы можете изменить массив $statuses и число дней $days_ago в вызове функции по необходимости. Например, чтобы удалить заказы со статусом 'failed' старше 60 дней:
wpcontrol_delete_old_orders( array('failed'), 60 );Проверка результата после внедрения
1. Подключитесь к базе данных и выполните запрос для подсчёта заказов с нужным статусом и датой до и после запуска крона:
SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order'
AND post_status IN ('wc-cancelled', 'wc-failed')
AND post_date < '2023-01-01 00:00:00';2. Можно добавить временный лог внутри функции для отладки:
error_log( 'Deleted order ID: ' . $order_id );3. Для ручного теста вызовите функцию напрямую через admin-ajax или WP-CLI.
Частые ошибки и как их исправить
- Ничего не удаляется — проверьте, что статус заказа правильно указан с префиксом 'wc-' в базе (например, 'wc-cancelled'). В
wc_get_ordersможно передавать без 'wc-', но в запросах SQL важно учитывать префикс. - Функция не запускается по расписанию — убедитесь, что WP-Cron работает (например, посетите сайт и проверьте логи). Можно использовать системный cron для вызова
wp-cron.php. - Удаляются не те заказы — проверьте параметры даты и статуса, добавьте отладочный вывод для проверки выборки.
- Ошибки в базе при удалении — возможно, есть сторонние плагины, которые блокируют удаление. Попробуйте отключить плагины или использовать метод
$order->set_status('trash')вместо полного удаления.
Практические советы по безопасности и производительности
- Перед массовым удалением сделайте резервную копию базы данных.
- Ограничьте количество удаляемых заказов за один запуск, чтобы не перегружать сервер. Например, используйте параметр
limit = 100. - Внедрите логирование удалённых заказов для отслеживания действий.
- Если база большая, используйте WP-CLI для запуска скрипта, что ускорит процесс.
- Не удаляйте заказы с важными статусами, например, 'completed' или 'processing', без подтверждения.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин для очистки заказов | Простота использования, настройки через UI | Могут быть избыточными, нагрузка на сайт, не всегда гибко |
| Самописный код с WP-Cron (как в статье) | Точный контроль, лёгкая настройка, без сторонних зависимостей | Требует базовых знаний PHP и WP API, настройка cron |
| Удаление через SQL-запросы напрямую | Быстро и эффективно для больших баз | Риск повреждения данных, требует осторожности и резервного копирования |