Диагностика проблемы: зачем и когда удалять старые заказы в WooCommerce
В магазинах с большим объемом продаж база данных заказов быстро растет. Старые, закрытые или отменённые заказы, которые не нужны для отчетности, могут замедлять работу сайта и влиять на производительность базы данных. Особенно это актуально для WooCommerce магазинов с хостингом на средних ресурсах.
Проверка актуальности заказов и их удаление помогает:
- снизить нагрузку на базу данных;
- ускорить бэкапы и обновления;
- уменьшить время отклика запросов в админке;
- улучшить общую производительность сайта.
Как определить, что заказы можно удалять
Обычно удаляют заказы со статусом cancelled, failed или refunded, которые были созданы более 30 дней назад и не несут юридической необходимости для хранения.
Пошаговое решение: автоматическое удаление старых заказов с помощью WP-Cron и кода
Мы создадим функцию, которая будет запускаться раз в сутки и удалять заказы, соответствующие критериям. Для этого используем WP-Cron, чтобы не нагружать сервер.
1. Добавляем функцию удаления
function wps_delete_old_wc_orders() {
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-cancelled', 'wc-failed', 'wc-refunded'),
'date_query' => array(
array(
'column' => 'post_date',
'before' => '30 days ago',
),
),
'posts_per_page' => -1,
'fields' => 'ids',
'no_found_rows' => true,
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true - принудительное удаление
}
}
}2. Настраиваем WP-Cron для ежедневного запуска
function wps_schedule_daily_order_cleanup() {
if (!wp_next_scheduled('wps_daily_order_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'wps_daily_order_cleanup_hook');
}
}
add_action('wp', 'wps_schedule_daily_order_cleanup');
add_action('wps_daily_order_cleanup_hook', 'wps_delete_old_wc_orders');3. Как добавить код
Добавьте оба блока в файл functions.php вашей дочерней темы или в собственный плагин. Не используйте основной файл темы, чтобы не потерять изменения при обновлении.
Проверка результата после внедрения
Для проверки:
- Создайте тестовые заказы с нужными статусами (отменённые, неудачные) и датой старше 30 дней (можно изменить дату в базе или создать с помощью SQL).
- Запустите вручную функцию
wps_delete_old_wc_orders()через консоль WP-CLI или временно вызовите ее в коде. - Проверьте, что заказы удалились из админки WooCommerce и из таблицы
wp_posts. - Убедитесь, что WP-Cron срабатывает: можно временно изменить расписание с 'daily' на 'hourly' для ускоренного теста.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что статусы заказов прописаны с префиксом
wc-(например,wc-cancelled), а не простоcancelled. - WP-Cron не срабатывает: Если на сервере нет внешних посещений, WP-Cron может не запускаться. Для теста можно использовать плагин WP Crontrol или настроить системный cron для вызова
wp-cron.php. - Удаляются нужные заказы: Проверьте фильтр по дате и статусам, чтобы не удалить актуальные заказы. Включите логирование ID удалённых заказов.
Практические советы по безопасности и производительности
- Безопасность: Используйте
wp_delete_post($order_id, true)для полного удаления, иначе заказы уйдут в корзину (trash). Не удаляйте заказы со статусомprocessingилиcompleted. - Производительность: При большом количестве заказов ограничьте количество удаляемых за раз (например,
posts_per_page => 100) и запускайте функцию несколько раз с wp-cron или через AJAX. - Логирование: Для отладки добавьте лог в файл, например:
error_log('Удалён заказ ID: ' . $order_id);Сравнение вариантов удаления заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Неэффективно при большом объёме |
| Плагины очистки базы | Автоматизация, удобный интерфейс | Добавляют нагрузку, могут конфликтовать |
| Код на WP-Cron (описанный) | Лёгкий, гибкий, без лишних плагинов | Нужно писать и тестировать код |