Почему важно удалять старые заказы в WooCommerce
Большое количество старых заказов в базе данных WooCommerce может негативно влиять на производительность сайта, замедлять админ-панель и увеличивать размер резервных копий. Особенно актуально для магазинов с большим объемом продаж. Автоматизация удаления заказов по заданным критериям помогает поддерживать базу в чистоте без ручной работы.
Диагностика проблемы: как определить, что пора удалять заказы
Если вы заметили следующие симптомы, стоит задуматься об очистке заказов:
- Замедленная загрузка страниц админки WooCommerce — особенно вкладки «Заказы»;
- Увеличение размера базы данных и длительность резервного копирования;
- Высокое потребление ресурсов при работе с заказами;
- Наличие большого количества заказов с статусом
completed,cancelledилиrefunded, которые физически не нужны для отчетности.
Пошаговое решение: удаление заказов по статусу и дате через WP-CLI и cron
1. Создание PHP-функции для выборки и удаления заказов
Добавьте следующий код в файл functions.php вашей темы или в собственный плагин:
function wpcorp_delete_old_orders() {
// Настройки: статусы и возраст заказов (в днях)
$statuses = array('completed', 'cancelled', 'refunded');
$days_old = 90; // удалить заказы старше 90 дней
$date_query = array(
'column' => 'post_date',
'before' => date('Y-m-d H:i:s', strtotime("-{$days_old} days")),
);
$args = array(
'post_type' => 'shop_order',
'post_status' => $statuses,
'date_query' => array($date_query),
'posts_per_page' => -1,
'fields' => 'ids',
'no_found_rows' => true,
);
$query = new WP_Query($args);
if (empty($query->posts)) {
return 0; // нет заказов для удаления
}
foreach ($query->posts as $order_id) {
wp_delete_post($order_id, true); // принудительное удаление без корзины
}
return count($query->posts);
}2. Автоматизация запуска через WP-Cron
Добавьте регистрацию и запуск задачи cron в тот же файл:
if (!wp_next_scheduled('wpcorp_delete_old_orders_cron')) {
wp_schedule_event(time(), 'daily', 'wpcorp_delete_old_orders_cron');
}
add_action('wpcorp_delete_old_orders_cron', function() {
$deleted_count = wpcorp_delete_old_orders();
if ($deleted_count > 0) {
error_log("[WooCommerce] Удалено старых заказов: {$deleted_count}");
}
});3. Ручной запуск через WP-CLI
Если есть доступ к консоли сервера, можно запускать удаление вручную:
wp eval 'echo wpcorp_delete_old_orders() . " заказов удалено.\n";'Проверка результата после внедрения
Чтобы убедиться, что удаление сработало:
- Проверьте логи сайта (error_log) на наличие записей о количестве удалённых заказов;
- В админке WooCommerce сравните количество заказов до и после запуска скрипта;
- Запустите WP-CLI команду для повторной проверки — количество заказов должно уменьшиться;
- Проверьте размер базы данных и время загрузки страницы заказов.
Частые ошибки и как их исправить
- Неправильные статусы заказов в массиве: убедитесь, что используете именно статусы заказов WooCommerce, а не статусы публикации WordPress. Используйте
wc_get_order_statuses()для проверки. - Функция wp_delete_post не удаляет заказ: проверьте права пользователя и наличие блокировок базы данных.
- cron-задача не запускается: убедитесь, что у вас настроен wp-cron или используйте системный cron для обращения к
wp-cron.php. - При большом количестве заказов скрипт превышает лимит времени: разбейте удаление на партии с помощью параметра
posts_per_pageи запускайте несколько циклов.
Практические советы по безопасности и производительности
- Перед удалением обязательно создайте резервную копию базы данных.
- Запускайте удаление в периоды минимальной нагрузки.
- Используйте
wp_delete_post($order_id, true)с параметромtrueдля полного удаления без помещения в корзину. - Для больших магазинов реализуйте пакетную обработку — например, удалять по 100 заказов за один запуск.
- Если ваш магазин работает с налоговой, убедитесь, что удаление заказов не нарушает законодательство.
Сравнение подходов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Трудоемко, риск ошибок, не подходит для большого количества заказов |
| WP-CLI скрипт | Быстро, можно автоматизировать, подходит для больших баз | Требуется доступ к серверу и навыки работы с консолью |
| WP-Cron задача | Полная автоматизация, не требует участия пользователя | Может не запускаться при низком трафике, нужно контролировать |