Диагностика задачи: зачем автоматически удалять заказы в WooCommerce
Интернет-магазины на WooCommerce могут накапливать большое количество заказов в базе данных, что замедляет сайт и усложняет администрирование. Особенно это касается заказов в статусе «отменён», «ожидание оплаты» или «выполнено» старше определённого срока.
Автоматическое удаление устаревших заказов помогает поддерживать чистоту базы и ускорять работу сайта без дополнительных плагинов.
Пошаговое решение: код для автоматического удаления заказов по сроку
1. Использование WP-Cron для планирования задачи
Первым делом нужно создать кастомное событие, которое будет регулярно запускаться и удалять заказы.
if ( ! wp_next_scheduled( 'wc_delete_old_orders_daily' ) ) {
wp_schedule_event( time(), 'daily', 'wc_delete_old_orders_daily' );
}2. Функция удаления заказов старше N дней
Напишем функцию, которая будет получать все заказы с нужным статусом и датой создания старше определённого количества дней, и удалять их.
function wc_delete_old_orders() {
$days = 30; // Срок хранения заказов в днях
$date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$args = array(
'post_type' => 'shop_order',
'posts_per_page' => -1,
'post_status' => array('wc-cancelled', 'wc-failed', 'wc-completed'),
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date,
),
),
'fields' => 'ids',
);
$orders = get_posts( $args );
if ( ! empty( $orders ) ) {
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
}
}
add_action( 'wc_delete_old_orders_daily', 'wc_delete_old_orders' );3. Добавление очистки при деактивации темы или плагина
Чтобы не оставлять запланированные задачи без контроля, удалим крон-событие при деактивации.
function wc_delete_old_orders_deactivate() {
wp_clear_scheduled_hook( 'wc_delete_old_orders_daily' );
}
register_deactivation_hook( __FILE__, 'wc_delete_old_orders_deactivate' );Проверка результата
- Запустите код и проверьте в базе данных наличие заказов старше 30 дней со статусами
cancelled,failed,completed. - Вручную вызовите функцию
wc_delete_old_orders()через WP-CLI или временно добавьте вызов в админке, чтобы убедиться, что заказы удаляются. - Проверьте, что событие
wc_delete_old_orders_dailyдобавлено в расписание WP-Cron (например, с помощью плагина WP Crontrol).
Частые ошибки и способы их исправления
- Заказы не удаляются: Проверьте, что в
post_statusуказаны правильные статусы заказов (нужны префиксыwc-). - WP-Cron не срабатывает: Убедитесь, что на сервере посещают сайт или настроен системный cron для запуска WP-Cron.
- Удаление происходит, но не полностью: Возможно, заказ связан с метаданными или записями в таблицах, которые не удаляются автоматически. Используйте
wp_delete_post($order_id, true)с параметромtrueдля полного удаления. - Удаление слишком частое или редкое: Проверьте расписание события и интервал запуска (в примере – "daily" – раз в сутки).
Практические советы по безопасности и производительности
- Не устанавливайте слишком маленький срок хранения заказов (например, меньше 7 дней), чтобы избежать случайной потери данных.
- Удаляйте заказы только с определёнными статусами, чтобы не потерять активные или важные заказы.
- Если заказов много, делайте удаление пакетами (например, по 50-100 за раз), чтобы избежать проблем с нагрузкой и таймаутами.
- Для контроля добавьте логирование удалённых заказов в отдельный файл или системный журнал.
Сравнение способов удаления заказов: плагин vs код
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин (например, WP Sweep, Advanced Database Cleaner) | Удобный интерфейс, дополнительные функции очистки, регулярные обновления | Дополнительная нагрузка, зависимость от стороннего кода, возможные конфликты |
| Самописный код (как в статье) | Лёгкий, гибкий, без лишних зависимостей, точечное решение | Требует навыков программирования, необходимость поддержки кода |