Диагностика задачи: зачем и когда нужно удалять заказы автоматически
В WooCommerce накопление старых заказов может привести к разрастанию базы данных, что негативно скажется на производительности сайта. Особенно актуально для магазинов с большим количеством заказов и ограниченным хостингом. Автоматическое удаление заказов по определённому сроку помогает поддерживать базу данных в чистоте и снижать нагрузку.
Часто пользователи спрашивают: как настроить удаление заказов старше 30, 60 или 90 дней без использования сторонних плагинов или с минимальными зависимостями. Ниже рассмотрим конкретные технические решения.
Как определить заказы, подлежащие удалению
Для удаления по сроку нужно учитывать статус заказа и дату его создания. Обычно удаляют заказы со статусами cancelled, failed, refunded или completed, если они уже не актуальны.
Пример запроса для выборки заказов старше 60 дней со статусом cancelled:
$args = [
'status' => 'cancelled',
'date_created' => '<' . ( new WC_DateTime( '-60 days' ) )->format( 'Y-m-d H:i:s' ),
'limit' => -1,
];
$orders = wc_get_orders( $args );
Этот код возвращает все отмененные заказы, созданные более 60 дней назад.
Пошаговое решение: настройка автоматического удаления заказов через cron
1. Создаём функцию удаления заказов по дате и статусу
function wpdream_delete_old_orders() {
$statuses = [ 'cancelled', 'failed', 'refunded' ];
$days = 60; // удалять заказы старше 60 дней
foreach ( $statuses as $status ) {
$args = [
'status' => $status,
'date_created' => '<' . ( new WC_DateTime( "-{$days} days" ) )->format( 'Y-m-d H:i:s' ),
'limit' => -1,
'return' => 'ids',
];
$order_ids = wc_get_orders( $args );
foreach ( $order_ids as $order_id ) {
wp_delete_post( $order_id, true ); // принудительное удаление
}
}
}
2. Регистрируем WP-Cron задачу для запуска ежедневно
add_action( 'wpdream_daily_order_cleanup', 'wpdream_delete_old_orders' );
function wpdream_schedule_order_cleanup() {
if ( ! wp_next_scheduled( 'wpdream_daily_order_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wpdream_daily_order_cleanup' );
}
}
add_action( 'wp', 'wpdream_schedule_order_cleanup' );
3. Отключаем задачу при деактивации темы или плагина
function wpdream_unschedule_order_cleanup() {
$timestamp = wp_next_scheduled( 'wpdream_daily_order_cleanup' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpdream_daily_order_cleanup' );
}
}
register_deactivation_hook( __FILE__, 'wpdream_unschedule_order_cleanup' );
Проверка результата после внедрения кода
- Запустите cron вручную через WP CLI:
wp cron event run wpdream_daily_order_cleanup - Проверьте таблицу
wp_postsс типомshop_orderна наличие заказов со статусом, которые должны удаляться, и с датой старше 60 дней — они должны исчезнуть после выполнения. - Для отладки добавьте логирование в функцию удаления, например, запись ID удалённых заказов в файл или в системный лог.
Частые ошибки и как их исправить
- Удаление не происходит: Проверьте, что WP-Cron работает (например, установите плагин WP Crontrol для мониторинга задач). Если cron не запускается, настройте системный cron через хостинг.
- Заказы не удаляются полностью: Используйте
wp_delete_post( $order_id, true )с параметромtrueдля принудительного удаления без помещения в корзину. - Удаляются не те заказы: Проверьте правильность статусов и даты в запросе
wc_get_orders(). Например, иногда заказы могут иметь статусprocessing, их не стоит удалять без проверки. - Высокая нагрузка при удалении большого количества заказов: Реализуйте удаление партиями, например, по 50 заказов за раз, чтобы избежать таймаутов.
Практические советы по безопасности и производительности
- Не удаляйте заказы со статусом
completedилиprocessingбез веских причин — это может привести к потере данных по продажам. - Создайте резервную копию перед запуском автоматического удаления.
- Для больших магазинов рассмотрите использование WP CLI скриптов для пакетной очистки, которые можно запускать вручную или по расписанию системным cron.
- Если используете Clearfy Pro от WPShop, можно дополнительно оптимизировать базу и удалить дублирующуюся метаинформацию у заказов.
Сравнение вариантов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron + wc_get_orders + wp_delete_post | Полный контроль, гибкость по статусам и срокам, без сторонних плагинов | Зависит от корректной работы WP-Cron, может нагружать сайт при большом количестве заказов |
| WP CLI скрипт удаления заказов | Очень быстро, не зависит от WP-Cron, подходит для больших баз | Требует доступа к серверу и знаний WP CLI |
| Плагины (например, WooCommerce Cleanup) | Простота настройки, GUI, дополнительные функции | Может влиять на производительность, меньше гибкости |