Диагностика проблемы: зачем и когда удалять отменённые заказы в WooCommerce
Отменённые заказы в WooCommerce со временем накапливаются и занимают место в базе данных, что может замедлять работу административной панели и влиять на бэкапы. Особенно это актуально для магазинов с большим потоком заказов. Однако просто удалять заказы без контроля рискованно — нужно отслеживать, когда и какие записи удаляются, чтобы избежать потери важных данных.
Пошаговое решение: автоматизация удаления отменённых заказов с логированием
1. Создаём кастомный лог для удаления заказов
Для контроля действий рекомендуем создать отдельный лог-файл, куда будут записываться ID и дата удаления заказов. Это поможет отследить процесс и при необходимости восстановить данные.
function wc_log_cancelled_order_deletion( $order_id ) {
if ( ! class_exists( 'WC_Logger' ) ) {
return;
}
$logger = wc_get_logger();
$context = array( 'source' => 'auto-cancelled-orders-deletion' );
$logger->info( "Удалён заказ ID: {$order_id} - статус отменён", $context );
}2. Создаём функцию удаления заказов со статусом 'cancelled'
Добавляем функцию, которая получает все заказы со статусом 'cancelled', старше определённого количества дней (например, 30), и удаляет их с помощью стандартных функций WooCommerce.
function wc_auto_delete_cancelled_orders() {
$days_to_keep = 30;
$date_query = date( 'Y-m-d H:i:s', strtotime( "-{$days_to_keep} days" ) );
$args = array(
'status' => 'cancelled',
'date_created' => '<' . $date_query,
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders( $args );
if ( empty( $orders ) ) {
return;
}
foreach ( $orders as $order_id ) {
wc_log_cancelled_order_deletion( $order_id );
wp_trash_post( $order_id ); // Перемещаем в корзину (безопаснее, чем сразу удалять)
}
}3. Запускаем функцию по расписанию с помощью WP-Cron
Добавим событие, которое будет запускать удаление заказов раз в сутки.
function wc_schedule_cancelled_orders_deletion() {
if ( ! wp_next_scheduled( 'wc_daily_cancelled_orders_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wc_daily_cancelled_orders_cleanup' );
}
}
add_action( 'wp', 'wc_schedule_cancelled_orders_deletion' );
add_action( 'wc_daily_cancelled_orders_cleanup', 'wc_auto_delete_cancelled_orders' );Проверка результата: как убедиться, что удаление работает
- В базе данных через phpMyAdmin или аналог проверяем, что заказы со статусом 'cancelled' старше 30 дней перемещены в корзину (wp_posts.post_status = 'trash').
- Лог-файл WooCommerce (обычно
wp-content/uploads/wc-logs/) содержит записи об удалённых заказах с датами и ID. - В админке WooCommerce в разделе заказов отменённые заказы старше 30 дней отсутствуют или находятся в корзине.
- Для теста можно временно уменьшить
$days_to_keepв функции до 1-2 дней и проверить выполнение задачи на следующий день.
Частые ошибки и как их исправить
- Удаление не происходит: Проверьте, что WP-Cron работает на сервере. Для этого можно использовать плагин WP Crontrol и убедиться, что событие
wc_daily_cancelled_orders_cleanupзапланировано. - Лог не создаётся: Убедитесь, что директория
wp-content/uploads/wc-logs/доступна для записи и что функцияwc_get_logger()есть в вашей версии WooCommerce (требуется 3.8+). - Заказы удаляются слишком рано: Проверьте значение переменной
$days_to_keep, установите нужное количество дней, чтобы избежать преждевременного удаления. - Заказы удаляются сразу, а не в корзину: Используйте
wp_trash_post()вместоwp_delete_post()для безопасности. Если хотите окончательно удалить, замените наwp_delete_post( $order_id, true ).
Практические советы по безопасности и производительности
- Безопасность данных: Используйте перемещение в корзину вместо прямого удаления, чтобы при ошибке можно было восстановить заказ.
- Производительность: Если у вас очень большой магазин, ограничьте количество заказов, удаляемых за один запуск, добавив параметр
'limit' => 50и реализовав постепенное удаление с помощью повторных запусков WP-Cron. - Резервные копии: Перед внедрением автоматического удаления обязательно делайте резервные копии базы данных.
- Мониторинг: При необходимости интегрируйте отправку уведомлений администратору при удалении заказов, например, через email или Slack.
Сравнение способов удаления отменённых заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Удаление через WP-Cron с логированием (код) | Полный контроль, безопасность, автоматизация, логирование | Требует навыков разработки, настройка WP-Cron |
| Удаление через плагин (например, WP Bulk Delete) | Простота использования, интерфейс | Меньший контроль, нет логирования, нагрузка при удалении |
| Ручное удаление в админке | Простота, не требует кода | Трудозатратно, риск пропуска заказов, нет автоматизации |