Почему нужно автоматически удалять заказы по статусу в WooCommerce
В интернет-магазинах на WooCommerce со временем накапливаются заказы с разными статусами: отменённые, возвраты, черновики и т.д. Некоторые из них уже не нужны, но занимают место в базе данных и замедляют работу сайта. Автоматическое удаление заказов с определённым статусом помогает поддерживать базу в чистоте и улучшает производительность.
Диагностика проблемы: как определить, нужны ли автоматические удаления
Первым шагом проверьте, есть ли в вашем магазине заказы с устаревшими статусами, которые не должны храниться длительное время. Для этого выполните SQL-запрос в базе данных или используйте WP-CLI:
wp post list --post_type=shop_order --post_status=wc-cancelled --fields=ID,post_date --format=tableЕсли количество таких заказов превышает сотни или тысячи, стоит задуматься об автоматическом удалении.
Пошаговое решение: как настроить автоматическое удаление заказов по статусу
1. Создаём функцию для удаления заказов
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:
function wpmarketing_delete_orders_by_status( $status = 'wc-cancelled', $days_old = 30 ) {
if ( ! class_exists( 'WC_Order_Query' ) ) {
return;
}
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_old} days" ) );
$args = [
'limit' => -1,
'status' => $status,
'date_created' => '<' . $date_threshold,
'return' => 'ids',
];
$orders = wc_get_orders( $args );
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
}2. Автоматизируем удаление через Cron
Добавим планировщик задачи, которая будет запускать функцию автоматически раз в сутки.
// Регистрируем событие при активации темы или плагина
function wpmarketing_schedule_order_cleanup() {
if ( ! wp_next_scheduled( 'wpmarketing_daily_order_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wpmarketing_daily_order_cleanup' );
}
}
add_action( 'wp', 'wpmarketing_schedule_order_cleanup' );
// Хук для удаления заказов
add_action( 'wpmarketing_daily_order_cleanup', function() {
// Удаляем заказы со статусом 'cancelled', старше 30 дней
wpmarketing_delete_orders_by_status( 'cancelled', 30 );
} );
// Очистка при деактивации
function wpmarketing_unschedule_order_cleanup() {
$timestamp = wp_next_scheduled( 'wpmarketing_daily_order_cleanup' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpmarketing_daily_order_cleanup' );
}
}
register_deactivation_hook( __FILE__, 'wpmarketing_unschedule_order_cleanup' );Как проверить, что автоматическое удаление работает
- Создайте тестовый заказ со статусом
cancelledи датой создания старше 30 дней (можно через базу данных). - Запустите вручную функцию
wpmarketing_delete_orders_by_status('cancelled', 30)через WP-CLI или временно добавьте вызов вfunctions.php. - Проверьте, что заказ удалён, например, через админку WooCommerce или SQL-запрос.
- Проверьте журнал ошибок и логи сервера на предмет ошибок удаления.
Частые ошибки и способы их устранения
- Заказы не удаляются: Проверьте, что у вас есть права на удаление постов, и функция вызывается корректно.
- Неправильный статус заказа: WooCommerce использует статус с префиксом
wc-в базе данных, но дляwc_get_ordersдостаточно указать статус без префикса, напримерcancelled. - Удаляются не все нужные заказы: Проверьте параметр
date_createdи формат даты, а также правильно ли передаётся количество дней. - Ошибка с Cron: Убедитесь, что на вашем сервере настроен WP-Cron или системный cron для запуска планировщика.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы данных перед автоматическими удалениями.
- Для больших магазинов с тысячами заказов разбивайте удаление на партии, например, добавьте параметр
'limit' => 100и запускайте функцию несколько раз. - Используйте
wp_delete_post( $order_id, true )с параметромtrueдля полного удаления без перемещения в корзину. - Проверяйте логи и исключайте из удаления заказы с нестандартными статусами или важные для аналитики.
Таблица сравнения способов удаления заказов WooCommerce
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Ручное удаление через админку | Простота, контроль по каждому заказу | Неэффективно при большом объёме | WooCommerce → Заказы → Удалить |
| SQL-запрос в базе | Очень быстро и массово | Риск потери данных, требует знаний SQL | DELETE FROM wp_posts WHERE post_type='shop_order' AND post_status='wc-cancelled' AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY); |
| Автоматизация через wp_schedule_event | Полная автоматизация, гибкость | Требует программирования, настройка cron | Код из статьи выше |