Диагностика проблемы: зачем автоматически удалять отменённые заказы в WooCommerce
В интернет-магазинах на WooCommerce с большой нагрузкой количество отменённых заказов может расти быстро, занимая место в базе данных и замедляя работу админ-панели. Отменённые заказы обычно не нужны для аналитики и отчётов, и их лучше удалять автоматически, чтобы поддерживать базу в чистоте. Однако простое удаление может привести к потере данных без возможности восстановления, поэтому важно вести логирование операций удаления для последующего аудита.
Пошаговое решение: как настроить автоматическое удаление отменённых заказов с логированием
1. Создаём пользовательскую функцию для удаления заказов
Добавим в файл functions.php вашей темы или в отдельный плагин следующий код. Он будет искать отменённые заказы старше 7 дней, удалять их и записывать информацию в лог-файл.
function wpcource_delete_cancelled_orders_with_log() {
$args = array(
'status' => 'cancelled',
'date_modified' => '<' . ( time() - 7 * DAY_IN_SECONDS ),
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders($args);
if (empty($orders)) {
return;
}
$log_file = WP_CONTENT_DIR . '/cancelled-orders-delete.log';
$log_entries = [];
foreach ($orders as $order_id) {
$order = wc_get_order($order_id);
$data = sprintf("Deleting Order ID: %d, Date: %s, Total: %s", $order_id, $order->get_date_created()->date('Y-m-d H:i:s'), $order->get_total());
$log_entries[] = $data;
wp_delete_post($order_id, true); // жесткое удаление
}
if (!empty($log_entries)) {
$log_text = date('Y-m-d H:i:s') . " - Deleted cancelled orders:\n" . implode("\n", $log_entries) . "\n\n";
file_put_contents($log_file, $log_text, FILE_APPEND | LOCK_EX);
}
}
// Запускаем очистку раз в сутки
add_action('wpcource_daily_cleanup', 'wpcource_delete_cancelled_orders_with_log');
// Запланируем событие при активации темы или плагина
function wpcource_schedule_daily_cleanup() {
if (!wp_next_scheduled('wpcource_daily_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpcource_daily_cleanup');
}
}
add_action('wp', 'wpcource_schedule_daily_cleanup');2. Как проверить, что удаление работает
- Проверьте, что в базе есть отменённые заказы старше 7 дней.
- Запустите вручную функцию, например, через
do_action('wpcource_daily_cleanup');вfunctions.phpили вызовите из консоли WP-CLI. - Проверьте, что отменённые заказы удалились из админки WooCommerce.
- Откройте файл
wp-content/cancelled-orders-delete.logи убедитесь, что там записаны данные об удалённых заказах.
Проверка результата после внедрения
Для контроля можно добавить в лог количество удалённых заказов и время выполнения функции:
function wpcource_delete_cancelled_orders_with_log() {
$args = array(
'status' => 'cancelled',
'date_modified' => '<' . ( time() - 7 * DAY_IN_SECONDS ),
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders($args);
$count = count($orders);
if ($count === 0) {
return;
}
$start = microtime(true);
$log_file = WP_CONTENT_DIR . '/cancelled-orders-delete.log';
$log_entries = [];
foreach ($orders as $order_id) {
$order = wc_get_order($order_id);
$data = sprintf("Deleting Order ID: %d, Date: %s, Total: %s", $order_id, $order->get_date_created()->date('Y-m-d H:i:s'), $order->get_total());
$log_entries[] = $data;
wp_delete_post($order_id, true);
}
$duration = microtime(true) - $start;
$log_text = date('Y-m-d H:i:s') . " - Deleted $count cancelled orders in " . round($duration, 2) . " seconds:\n" . implode("\n", $log_entries) . "\n\n";
file_put_contents($log_file, $log_text, FILE_APPEND | LOCK_EX);
}Частые ошибки и как их исправить
- Отсутствие прав на запись в лог-файл: Убедитесь, что папка
wp-contentдоступна для записи сервером. Иначе лог не создастся. - Некорректный параметр
date_modifiedвwc_get_orders: WooCommerce не всегда корректно фильтрует по дате в параметреdate_modified. Вместо этого можно фильтровать вручную через цикл, проверяя дату заказа. - Удаление заказов, которые ещё нужны для отчетов: Перед удалением уточните, что отменённые заказы действительно не нужны для вашей аналитики.
- Дублирование запланированных задач: При повторной активации темы/плагина проверяйте, что событие не запланировано несколько раз, чтобы избежать многократного запуска.
Практические советы по производительности и безопасности
- Для большого количества заказов делайте удаление пакетами по 50-100 заказов, чтобы избежать превышения времени выполнения скрипта.
- Регулярно архивируйте лог-файл и очищайте его, чтобы он не разрастался.
- Для удобства мониторинга подключите плагин типа WP Crontrol, чтобы видеть и управлять запланированными задачами WordPress.
Сравнение вариантов реализации удаления отменённых заказов
| Вариант | Плюсы | Минусы |
|---|---|---|
| Удаление через WP Cron + логирование | Автоматизация, контроль через логи, гибкость настройки | Зависит от запуска WP Cron, возможно время выполнения |
| Удаление вручную через админку | Простота, отсутствие кода | Ручной труд, риск забыть очистить, не для больших магазинов |
| Удаление через внешние SQL-запросы | Очень быстро, минус нагрузки на WordPress | Риск повредить данные, сложность, отсутствие логов |