Проблема: накопление старых заказов в WooCommerce и влияние на производительность
WooCommerce хранит все заказы в базе данных WordPress, и со временем их количество может вырасти до нескольких тысяч или десятков тысяч. Это негативно влияет на скорость работы административной панели и замедляет запросы к базе данных. Стандартных инструментов для массового удаления старых заказов в WooCommerce мало, а ручное удаление через интерфейс неудобно и долго. Решение — автоматизировать удаление заказов старше определённого срока.
Диагностика проблемы: как определить, что нужно удалять заказы
Для начала стоит проверить текущее количество заказов и их возраст. Это можно сделать через WP-CLI или SQL-запрос:
SELECT COUNT(ID), MIN(post_date), MAX(post_date) FROM wp_posts WHERE post_type = 'shop_order';Если минимальная дата старше нескольких лет, а количество заказов очень большое, имеет смысл настроить автоматическое удаление.
Пошаговое решение: создаём скрипт для удаления заказов по дате
1. Добавим функцию в файл functions.php вашей темы или в кастомный плагин.
function wptool_delete_old_woocommerce_orders() {
if (!class_exists('WooCommerce')) {
return;
}
$days = 365; // удалять заказы старше 365 дней
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-completed', 'wc-cancelled', 'wc-refunded'],
'date_query' => [
[
'before' => $date,
],
],
'posts_per_page' => 100,
'fields' => 'ids',
'no_found_rows' => true,
];
$old_orders = get_posts($args);
if (empty($old_orders)) {
return;
}
foreach ($old_orders as $order_id) {
wp_delete_post($order_id, true); // true - принудительное удаление
}
}2. Запускаем эту функцию автоматически с помощью WP-Cron, чтобы удалять старые заказы раз в неделю:
add_action('wptool_weekly_order_cleanup', 'wptool_delete_old_woocommerce_orders');
if (!wp_next_scheduled('wptool_weekly_order_cleanup')) {
wp_schedule_event(time(), 'weekly', 'wptool_weekly_order_cleanup');
}3. Если нужно, можно запустить функцию вручную в админке через AJAX или WP-CLI.
Проверка результата после внедрения
- Выполните запрос SQL из раздела диагностики до и после удаления — количество заказов должно уменьшиться.
- Проверьте в админке WooCommerce — старые заказы должны исчезнуть.
- Проверьте логи ошибок и убедитесь, что нет фатальных ошибок при удалении.
- Для ручного запуска можно добавить временный вызов
wptool_delete_old_woocommerce_orders();и проверить вывод ошибок.
Частые ошибки и как их исправить
- Ничего не удаляется: проверьте, что статусы заказов в запросе соответствуют вашим. Возможно, у вас другие статусы.
- Удаляются нужные заказы: проверьте значение переменной
$daysи дату, по которой идёт фильтр. - Проблемы с производительностью: уменьшите число
posts_per_pageили разбивайте удаление на несколько шагов. - Заказы не удаляются полностью: используйте
wp_delete_post($order_id, true)с параметромtrueдля полного удаления, иначе заказы попадут в корзину.
Практические советы по безопасности и производительности
- Перед автоматическим удалением обязательно делайте резервную копию базы данных.
- Не запускайте удаление часто — 1 раз в неделю или месяц достаточно, чтобы не перегружать сервер.
- Включите логирование ошибок удаления для мониторинга и отладки.
- Проверяйте, что удаление не ломает связи с другими плагинами, особенно если вы используете сторонние расширения WooCommerce.
Сравнение вариантов удаления старых заказов WooCommerce
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление через админку | Простота | Долго, неудобно при большом количестве | Мало заказов |
| Плагины очистки базы | Удобство, дополнительные функции | Могут замедлять сайт, риск конфликтов | Для быстрого решения без кода |
| Автоматический скрипт с WP-Cron | Автоматизация, гибкость, контроль | Нужно писать код и тестировать | Большие магазины, требующие регулярной очистки |