Диагностика проблемы: зачем удалять заказы по статусу в WooCommerce?
WooCommerce хранит все заказы в базе данных, включая отменённые и завершённые. Со временем это приводит к разрастанию таблиц, ухудшению производительности и усложнению администрирования. Многие разработчики и владельцы магазинов хотят автоматически очищать базу от старых заказов с определёнными статусами, чтобы оптимизировать сайт. Встроенного инструмента для автоматического удаления заказов по статусу в WooCommerce нет, и популярные плагины часто не подходят из-за избыточности функций или риска потери данных.
Как проверить, что заказы с определёнными статусами есть и их нужно удалить?
Выполните SQL-запрос через phpMyAdmin или WP-CLI для подсчёта заказов по статусу:
SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Обратите внимание на статусы wc-cancelled, wc-completed и другие. Если их много и вы хотите удалить старые, переходите к следующему разделу.
Пошаговое решение: скрипт для автоматического удаления заказов по статусу и дате
Добавим в файл functions.php вашей дочерней темы или в отдельный плагин следующий код, который удалит заказы со статусами «отменён» и «завершён» старше 30 дней, используя WP-Cron.
function wpcore_auto_delete_old_orders() {
$statuses_to_delete = array('wc-cancelled', 'wc-completed');
$days_old = 30;
$date_cutoff = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));
foreach ($statuses_to_delete as $status) {
$orders = get_posts(array(
'post_type' => 'shop_order',
'post_status' => $status,
'date_query' => array(
array(
'before' => $date_cutoff,
'inclusive' => true,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
));
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — без помещения в корзину
}
}
}
// Регистрация задачи в WP-Cron, если ещё не зарегистрирована
if (!wp_next_scheduled('wpcore_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpcore_daily_order_cleanup');
}
add_action('wpcore_daily_order_cleanup', 'wpcore_auto_delete_old_orders');Этот код будет запускаться ежедневно и удалять заказы, соответствующие критериям.
Как запустить очистку вручную для теста
Для проверки можно вызвать функцию вручную, например, добавив в functions.php временно:
add_action('init', function() {
if (isset($_GET['wpcore_test_cleanup'])) {
wpcore_auto_delete_old_orders();
exit('Cleanup done');
}
});И перейти по URL https://ваш_сайт/?wpcore_test_cleanup.
Проверка результата после внедрения
- Повторите SQL-запрос из раздела диагностики, чтобы увидеть уменьшение количества заказов с нужными статусами.
- Проверьте админку WooCommerce: старые отменённые и завершённые заказы должны исчезнуть.
- Убедитесь, что свежие заказы остаются без изменений.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что WP-Cron работает. Для теста запустите вручную, как описано выше. Убедитесь, что код подключается и не содержит синтаксических ошибок.
- Удаляются нужные заказы: Проверьте временной фильтр
$days_old. Возможно, он установлен слишком большим или малым. Скорректируйте дату. - Проблемы с производительностью при большом количестве заказов: Ограничьте количество удаляемых заказов за один запуск, добавив параметр
'posts_per_page' => 100и реализуйте пагинацию. - Удаление не происходит из-за прав: Убедитесь, что пользователь с правами администратора или серверный процесс может удалять записи.
Практические советы по безопасности и производительности
- Удаляйте заказы только с подтверждёнными статусами — не трогайте заказы в процессе оформления.
- Создайте резервную копию базы перед внедрением автоматического удаления.
- Добавьте логирование в функцию удаления для отслеживания удалённых заказов, например, через
error_log()или сервисы логирования. - Если на сайте большой трафик, рассчитайте нагрузку на WP-Cron и при необходимости используйте системный cron через WP-CLI.
- Регулярно проверяйте таблицы базы данных и оптимизируйте их через инструменты типа WP-CLI или phpMyAdmin.
Сравнение способов удаления заказов по статусу
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Плагины управления заказами | Простота использования, UI для выбора | Перегрузка функционала, риск ошибок, нагрузка | Для админов без навыков кода |
| Ручное удаление через SQL | Быстро, прямой контроль | Риск потери данных, необходимость навыков | Для опытных разработчиков, единичные случаи |
| Автоматический WP-Cron скрипт (код) | Автоматизация, гибкость, без лишних плагинов | Нужно писать и тестировать код, требует контроля | Для разработчиков и сайтов с большим объёмом заказов |