Диагностика проблемы: зачем автоматически удалять отменённые заказы в WooCommerce
Отменённые заказы в WooCommerce накапливаются в базе данных, что может замедлять работу магазина и усложнять отчётность. Особенно это актуально для магазинов с большим объёмом заказов и частыми отменами. Ручное удаление неудобно и требует постоянного контроля, поэтому автоматизация решения помогает поддерживать базу данных в чистоте без лишних затрат времени.
Пошаговое решение: удаление отменённых заказов с логированием
1. Создаём функцию удаления отменённых заказов
В файле functions.php вашей темы или в отдельном плагине добавьте следующий код. Он удаляет заказы со статусом cancelled, которым больше 7 дней, и логирует каждое удаление в файл wp-content/uploads/order-cleanup.log:
function wc_delete_cancelled_orders_with_logging() {
if ( ! current_user_can( 'manage_woocommerce' ) ) {
return;
}
$args = array(
'limit' => -1,
'status' => 'cancelled',
'date_created' => '<' . ( time() - 7 * DAY_IN_SECONDS ),
'return' => 'ids',
);
$orders = wc_get_orders( $args );
if ( empty( $orders ) ) {
return;
}
$log_file = WP_CONTENT_DIR . '/uploads/order-cleanup.log';
$log_entries = array();
foreach ( $orders as $order_id ) {
$order = wc_get_order( $order_id );
if ( $order ) {
$order_number = $order->get_order_number();
$order_date = $order->get_date_created()->date('Y-m-d H:i:s');
$order->delete( true );
$log_entries[] = sprintf( "%s - deleted cancelled order #%s (ID: %d)", date('Y-m-d H:i:s'), $order_number, $order_id );
}
}
if ( ! empty( $log_entries ) ) {
file_put_contents( $log_file, implode("\n", $log_entries) . "\n", FILE_APPEND );
}
}
2. Запускаем удаление по расписанию (cron)
Добавьте хук, который будет запускать функцию ежедневно:
add_action( 'wc_daily_cancelled_order_cleanup', 'wc_delete_cancelled_orders_with_logging' );
if ( ! wp_next_scheduled( 'wc_daily_cancelled_order_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wc_daily_cancelled_order_cleanup' );
}
3. Отключение крон для предотвращения дублирования
Важно перед добавлением кода проверить, что событие не запланировано повторно, чтобы избежать дублирующих задач.
Проверка результата после внедрения
- Через 24 часа проверьте файл
wp-content/uploads/order-cleanup.log— в нём должны появиться записи об удалённых заказах. - Проверьте в админке WooCommerce, что заказы со статусом
cancelledстарше 7 дней удалены. - Для теста можно временно уменьшить время удаления с 7 дней до нескольких минут (изменив параметр в
'date_created'), чтобы ускорить проверку.
Частые ошибки и как их исправить
- Отсутствие прав на запись в файл логов: убедитесь, что папка
wp-content/uploadsдоступна для записи сервером. - Крон не срабатывает: проверьте, активен ли WP-Cron, и что нет конфликтов с плагинами, блокирующими задачи cron.
- Удаляются не те заказы: проверьте правильность фильтра по статусу и дате в параметрах
wc_get_orders(). - Удаление заказов не происходит: проверьте, что функция вызывается и не прерывается ошибками — включите WP_DEBUG для отладки.
Практические советы по безопасности и производительности
- Логируйте только ключевые действия, чтобы не перегружать диск лишними данными.
- Устанавливайте разумный период хранения заказов перед удалением — 7 дней или более, чтобы избежать случайной потери данных.
- Используйте отдельный плагин для подобных задач, чтобы не потерять код при обновлении темы.
- Проверяйте права доступа: функцию удаления должны запускать только администраторы.
Сравнение подходов удаления отменённых заказов
| Метод | Плагин | Код | Компромисс |
|---|---|---|---|
| Удаление отменённых заказов | Плагины автоматизации (например, WP Crontrol + кастомный код) | Самописный код с cron-хуками | Плагины проще в настройке, но могут замедлять сайт; код — гибче и легче, но требует навыков |
| Логирование | Плагины с журналированием | Запись в файл через PHP (как в примере) | Плагины предлагают удобный UI, код — минималистичен и не нагружает БД |