Диагностика проблемы: накопление закрытых и неактивных заказов в WooCommerce
В интернет-магазинах на WooCommerce со временем накапливаются заказы со статусом cancelled, failed, refunded и даже старые pending. Это увеличивает нагрузку на базу данных, замедляет админку и усложняет аналитику. Автоматическое удаление таких заказов избавляет от ручной работы и поддерживает чистоту данных.
Пошаговое решение: удаляем заказы по статусу и времени
1. Выбор статусов и периода удаления
Для начала определите, какие статусы считать неактивными и с какого возраста заказы удалять. Например, удалять отмененные и неудачные заказы старше 30 дней.
2. Реализация функции удаления заказов
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wc_delete_old_orders() {
$statuses_to_delete = array('cancelled', 'failed', 'refunded', 'pending');
$days_old = 30;
$date_query = array(
'before' => date('Y-m-d', strtotime("-{$days_old} days")),
'inclusive' => true,
);
$args = array(
'post_type' => 'shop_order',
'post_status' => array_map(function($s) { return 'wc-' . $s; }, $statuses_to_delete),
'date_query' => array($date_query),
'posts_per_page' => -1,
'fields' => 'ids',
);
$query = new WP_Query($args);
if (empty($query->posts)) {
return;
}
foreach ($query->posts as $order_id) {
wp_delete_post($order_id, true); // true чтобы удалить без корзины
}
}
// Запускаем задачу раз в сутки
add_action('wp_loaded', function() {
if (!wp_next_scheduled('wc_daily_delete_old_orders')) {
wp_schedule_event(time(), 'daily', 'wc_daily_delete_old_orders');
}
});
add_action('wc_daily_delete_old_orders', 'wc_delete_old_orders');3. Запуск очистки через WP-Cron
Код выше запускает функцию удаления заказов автоматически раз в сутки. Чтобы проверить работу, можно вызвать wc_delete_old_orders() вручную.
Проверка результата после внедрения
- В админке WooCommerce откройте заказы с указанными статусами и убедитесь, что заказы старше 30 дней отсутствуют.
- Проверьте логи сервера на ошибки удаления.
- Для отладки можно добавить
error_logвнутри цикла удаления заказов, например:error_log('Deleted order ID: ' . $order_id);
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что WP-Cron работает (можно использовать плагин WP Crontrol для мониторинга). Также убедитесь, что статусы указаны верно с префиксом
wc-. - Удаляются нужные заказы: внимательно проверьте фильтр по дате и статусам, чтобы не удалить активные или важные данные.
- Проблемы с производительностью: если заказов очень много, разбейте удаление на порции, например по 50 заказов за раз.
Практические советы по безопасности и производительности
- Перед автоматическим удалением всегда делайте резервную копию базы данных.
- Для больших магазинов лучше запускать удаление через WP-CLI с параметрами по порциям.
- Используйте плагин Clearfy Pro для дополнительной оптимизации и очистки WooCommerce, включая удаление дублей и оптимизацию таблиц.
- Добавьте логирование удалений в отдельный файл для контроля.
Сравнение вариантов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление в админке | Просто, без кода | Трудозатратно, не автоматично |
| Код с WP-Cron (как в статье) | Автоматично, гибко, полностью под контролем | Зависит от WP-Cron и правильности кода |
| Плагины для очистки WooCommerce | Удобный интерфейс, дополнительные функции | Могут быть платными, риск конфликтов |