Почему важно удалять старые отгруженные заказы в WooCommerce?
База данных WooCommerce с течением времени разрастается, особенно таблица заказов (wp_posts с типом shop_order). Старые отгруженные заказы (статус completed) занимают место и замедляют запросы, что негативно сказывается на производительности сайта и бэкапах. Автоматическое удаление таких заказов помогает поддерживать базу в порядке без ручного вмешательства.
Диагностика: как определить, что пора чистить старые заказы
- Рост размера базы данных, особенно таблиц
wp_postsиwp_postmeta. - Замедленная работа админки при просмотре заказов.
- Долгое выполнение бэкапов и миграций.
- Высокое время отклика на REST API запросы к заказам.
Для оценки можно использовать плагины типа Query Monitor и инструменты хостинга для анализа размера таблиц.
Шаги для автоматического удаления заказов со статусом completed, старше 90 дней
1. Написание функции удаления заказов
Используем WP_Cron для регулярного запуска задачи и WC_Order_Query для выборки заказов. Важно удалять заказы через API WooCommerce, чтобы корректно удалить мета-данные и связи.
function wptask_delete_old_completed_orders() {
$args = array(
'limit' => -1,
'status' => 'completed',
'date_created' => '<' . ( time() - DAY_IN_SECONDS * 90 ),
'return' => 'ids',
);
$orders = wc_get_orders($args);
if (empty($orders)) {
return;
}
foreach ($orders as $order_id) {
wp_trash_post($order_id); // Перемещаем заказ в корзину
}
}
2. Регистрация wp_cron задачи
Запустим очистку раз в сутки.
function wptask_schedule_delete_old_orders() {
if (! wp_next_scheduled('wptask_daily_delete_old_orders')) {
wp_schedule_event(time(), 'daily', 'wptask_daily_delete_old_orders');
}
}
add_action('wp', 'wptask_schedule_delete_old_orders');
add_action('wptask_daily_delete_old_orders', 'wptask_delete_old_completed_orders');
3. Удаление заказов из корзины (Trash) автоматически
По умолчанию WordPress хранит записи в корзине 30 дней. Можно уменьшить этот срок, добавив в wp-config.php:
define('EMPTY_TRASH_DAYS', 7); // Удалять записи из корзины через 7 дней
Проверка результата после внедрения
- Просмотрите список заказов в WooCommerce — старые completed заказы должны отсутствовать.
- Проверьте размер таблиц
wp_postsиwp_postmetaчерез phpMyAdmin или админку хостинга — размер должен уменьшиться после нескольких дней работы скрипта. - Логи WP-Cron или плагина WP Crontrol покажут, что задача запускается ежедневно без ошибок.
- Запустите вручную функцию
wptask_delete_old_completed_orders()через admin-ajax или WP CLI для тестирования.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, активен ли WP-Cron, нет ли конфликтов с плагинами безопасности, которые блокируют wp_schedule_event.
- Удаляются и нужные заказы: убедитесь, что в фильтре даты правильно указан интервал; используйте
var_dump()для отладки выборки заказов. - Заказы остаются в корзине навсегда: проверьте наличие константы
EMPTY_TRASH_DAYSи убедитесь, что WP-Cron работает. - Проблемы с производительностью при удалении: разбейте удаление на батчи, например, по 50 заказов за раз, чтобы не перегружать сервер.
Практические советы по безопасности и производительности
- Запускайте функцию удаления в ночное время, чтобы снизить нагрузку.
- Резервное копирование базы перед внедрением автоматического удаления — обязательно.
- Для больших магазинов используйте WP-CLI скрипты с батчевой обработкой и отключайте автоматический запуск функций через WP-Cron.
- Логируйте удалённые заказы в отдельный файл для аудита.
Сравнение способов реализации удаления старых заказов
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron + API WooCommerce | Безопасно, корректно очищает данные | Зависит от WP-Cron, может быть медленнее | Код выше в статье |
| Прямой SQL-запрос | Очень быстро | Риск повреждения данных, оставление мета данных | |
| Плагины очистки базы | Удобно для непрофессионалов | Могут удалять лишнее, нагрузка на сайт | WP-Optimize, Advanced Database Cleaner |