Диагностика задачи: зачем удалять старые заказы в WooCommerce
В интернет-магазинах на WooCommerce с течением времени накапливается большое количество заказов, особенно с определёнными статусами (отменённые, возвраты, обработанные). Это может замедлять работу админки, увеличивать размер базы данных и усложнять бэкапы. Автоматическое удаление старых заказов по статусу и дате помогает поддерживать базу в оптимальном состоянии без ручного контроля.
Как настроить автоматическое удаление заказов в WooCommerce
Основные критерии отбора заказов
Для удаления необходимо выбрать:
- Статус заказов (например, 'cancelled', 'refunded')
- Период давности (например, старше 90 дней)
Это позволит точно контролировать, какие заказы будут удалены.
Пошаговое решение через пользовательский код
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
function wc_auto_delete_old_orders() {
if ( ! current_user_can( 'manage_woocommerce' ) ) {
return;
}
global $wpdb;
$statuses = array( 'cancelled', 'refunded' ); // Статусы для удаления
$days_old = 90; // Удалять заказы старше 90 дней
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_old} days" ) );
foreach ( $statuses as $status ) {
$order_ids = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
'wc-' . $status,
$date_threshold
) );
foreach ( $order_ids as $order_id ) {
wp_delete_post( $order_id, true ); // Полное удаление
}
}
}
// Запускаем раз в сутки через WP Cron
add_action( 'wp_loaded', function() {
if ( ! wp_next_scheduled( 'wc_auto_delete_old_orders_cron' ) ) {
wp_schedule_event( time(), 'daily', 'wc_auto_delete_old_orders_cron' );
}
});
add_action( 'wc_auto_delete_old_orders_cron', 'wc_auto_delete_old_orders' );Объяснение кода
- Определяем статусы заказов для удаления и дату порога.
- Запрашиваем ID заказов с нужными статусами и датой создания старше порога.
- Удаляем заказы полностью с помощью
wp_delete_postс параметромtrue. - Настраиваем cron-задачу для автоматического выполнения ежедневно.
Проверка результата после внедрения
Для проверки работоспособности:
- Создайте тестовые заказы с нужным статусом и датой старше 90 дней (можно вручную изменить дату в базе или использовать плагин для редактирования заказов).
- Запустите cron-задачу вручную через WP-CLI или через вызов функции в админке (например, временно заменить
wp_schedule_eventна немедленный запуск). - Проверьте, удалились ли соответствующие заказы в админке WooCommerce.
- Проверьте таблицы базы данных
wp_postsиwp_postmetaна наличие удалённых записей.
Частые ошибки и как их исправить
- Удаление не происходит: Убедитесь, что cron-задача запущена, и пользователь имеет права
manage_woocommerce. Для диагностики можно добавить логирование в функцию. - Удаляются не те статусы: Проверьте правильность префикса
wc-перед статусом и соответствие статусов с теми, что используются на сайте (wc-pending,wc-completedи т.д.). - Заказы не удаляются полностью: Проверьте, что
wp_delete_postвызывается с вторым параметромtrueдля полного удаления (без перемещения в корзину). - Производительность падает при большом количестве заказов: Добавьте лимит на количество заказов, удаляемых за один проход, например, 50, и запускайте cron чаще.
Практические советы по безопасности и производительности
- Перед внедрением автоматического удаления сделайте резервную копию базы данных.
- Добавьте логирование удалённых заказов в файл для аудита.
- Для больших баз предпочтительно использовать пакетную обработку с лимитом и сдвигом (offset) для избежания таймаутов.
- Используйте WP-CLI для запуска удаления вручную при необходимости.
- Обязательно проверяйте права пользователя, вызывающего функцию удаления, чтобы избежать несанкционированного удаления.
Таблица сравнения способов удаления старых заказов
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Код с WP Cron | Автоматизация, гибкость, не требует плагинов | Требует навыков кодирования, настройка cron | Для разработчиков, контроль над процессом |
| Плагины очистки базы (Clearfy Pro и др.) | Простота, интерфейс, дополнительные функции оптимизации | Могут быть платными, меньше гибкости | Для администраторов без навыков программирования |
| Ручное удаление через админку | Простота, не требует настроек | Трудозатратно, риск пропуска заказов | Малые магазины, разовые действия |