Диагностика проблемы: зачем удалять старые заказы в WooCommerce
Интернет-магазин на WooCommerce с течением времени копит большое количество заказов. Старые и выполненные заказы, которые больше не несут коммерческой ценности, занимают место в базе данных, замедляют работу административной панели и усложняют резервное копирование. Особенно актуально для магазинов с большим товарооборотом.
Проблема: стандартный WooCommerce не предлагает встроенных инструментов для массового удаления заказов по дате их завершения. Ручная очистка через админку непрактична при большом объеме данных.
Как автоматически удалять оконченные заказы WooCommerce по дате
Шаг 1: Создание пользовательской функции для удаления заказов
Основная идея — писать WP-Cron задачу, которая раз в сутки (или по другому расписанию) удаляет заказы со статусом completed, дата окончания которых старше заданного срока (например, 90 дней).
function wpreset_delete_old_completed_orders() {
$days = 90; // количество дней
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'post_type' => 'shop_order',
'post_status' => 'wc-completed',
'date_query' => [
[
'column' => 'post_date',
'before' => $date,
],
],
'posts_per_page' => 100, // лимит на обработку за раз
'fields' => 'ids',
];
$old_orders = get_posts($args);
if (empty($old_orders)) {
return;
}
foreach ($old_orders as $order_id) {
wp_delete_post($order_id, true); // полное удаление без корзины
}
}Шаг 2: Создание Cron задачи для автоматизации удаления
Добавим событие, которое будет запускать вышеописанную функцию один раз в день.
function wpreset_schedule_order_cleanup() {
if (!wp_next_scheduled('wpreset_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpreset_daily_order_cleanup');
}
}
add_action('wp', 'wpreset_schedule_order_cleanup');
add_action('wpreset_daily_order_cleanup', 'wpreset_delete_old_completed_orders');Проверка результата после внедрения
1. Убедитесь, что в админке WooCommerce остались только заказы новее 90 дней или со статусом, отличным от completed.
2. Запустите задачу вручную через WP-CLI для проверки (если доступен):
wp cron event run wpreset_daily_order_cleanup3. Проверьте логи сервера или добавьте временный лог в функцию удаления, чтобы убедиться, что она работает корректно.
Частые ошибки и как их исправить
- Функция не запускается по расписанию: проверьте, активен ли WP-Cron (включена настройка
DISABLE_WP_CRONдолжна быть отключена или настроена внешняя cron-задача). - Заказы не удаляются: убедитесь, что статус заказа указан правильно — WooCommerce использует префикс
wc-для статусов, напримерwc-completed. - Удаление затрагивает не те заказы: проверьте, что условие
date_queryправильно фильтрует по дате создания заказа (post_date). - Удаление медленное или вызывает таймаут: уменьшите
posts_per_pageи настройте многократный запуск задачи, чтобы обрабатывать заказы пакетами.
Практические советы по безопасности и производительности
- Безопасность: выполняйте удаление только после полной проверки условий, чтобы не потерять важные данные. Рекомендуется создавать резервные копии базы данных перед автоматическими удалениями.
- Производительность: используйте пакеты по 50-100 заказов, чтобы не перегружать сервер.
- Логирование: добавьте запись в лог для контроля количества удаленных заказов и времени выполнения.
Альтернативные методы: плагин vs код
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Непрактично при большом объеме | WooCommerce > Заказы > Фильтр по статусу/дате > Массовые действия |
| Плагин (например, Clearfy) | Удобный интерфейс, дополнительные настройки | Зависимость от стороннего кода, нагрузка | Настройки очистки заказов по дате и статусу |
| Код на PHP с WP-Cron (как в статье) | Гибкость, контроль, отсутствие лишних плагинов | Требует навыков, нужно тестировать | Смотри код выше |