Диагностика проблемы: зачем удалять заказы «в обработке» по времени
В WooCommerce заказы со статусом «В обработке» (processing) означают, что заказ получен и ожидает дальнейших действий, например, отправки товара. Иногда такие заказы остаются в базе неоплаченные или забытые, что нагружает базу данных и усложняет администрирование. Автоматическое удаление старых заказов со статусом «В обработке» помогает очистить базу и поддержать производительность магазина.
Как определить заказы для удаления
Ключевой критерий — время, прошедшее с момента создания заказа. Например, удалить все заказы в статусе «В обработке», которые старше 30 дней. Это легко реализуемо, если использовать стандартные функции WooCommerce и WP-Cron для регулярного запуска задачи.
Проверка текущих заказов в базе
$args = [
'status' => 'processing',
'date_created' => '<' . ( new WC_DateTime( '-30 days' ) )->getTimestamp(),
'limit' => -1,
];
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
echo 'Order ID: ' . $order->get_id() . ' Date: ' . $order->get_date_created()->date('Y-m-d H:i:s') . "\n";
}
Этот код можно использовать для диагностики: получить список старых заказов в статусе processing.
Пошаговое решение: автоматическое удаление заказов по расписанию
1. Создаем функцию удаления старых заказов
function wpassist_delete_old_processing_orders() {
$days = 30; // количество дней, старше которых удаляем
$date_threshold = ( new WC_DateTime( "-{$days} days" ) )->getTimestamp();
$orders = wc_get_orders([
'status' => 'processing',
'limit' => -1,
]);
foreach ( $orders as $order ) {
$created = $order->get_date_created();
if ( $created && $created->getTimestamp() < $date_threshold ) {
$order->delete( true ); // true - удаляет без возможности восстановления
}
}
}
2. Регистрируем WP-Cron задачу для регулярного запуска
add_action( 'wpassist_delete_processing_orders_cron', 'wpassist_delete_old_processing_orders' );
function wpassist_schedule_cron() {
if ( ! wp_next_scheduled( 'wpassist_delete_processing_orders_cron' ) ) {
wp_schedule_event( time(), 'daily', 'wpassist_delete_processing_orders_cron' );
}
}
add_action( 'wp', 'wpassist_schedule_cron' );
3. Отмена задания при деактивации плагина или темы (если применимо)
function wpassist_clear_cron() {
$timestamp = wp_next_scheduled( 'wpassist_delete_processing_orders_cron' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpassist_delete_processing_orders_cron' );
}
}
register_deactivation_hook( __FILE__, 'wpassist_clear_cron' );
Проверка результата после внедрения
- Запустите функцию вручную из консоли WP-CLI или временно вызовите
wpassist_delete_old_processing_orders()из файла функций, чтобы проверить удаление. - Проверьте базу данных в таблице
wp_postsс типомshop_orderи статусомwc-processing— заказы старше 30 дней должны отсутствовать. - Убедитесь, что WP-Cron событие запланировано:
wp cron event list(через WP-CLI), либо используйте плагин WP Crontrol.
Частые ошибки и их исправление
- Ошибка: заказы не удаляются — функция не вызывается.
Причина: WP-Cron не запускается автоматически на некоторых хостингах без трафика.
Решение: используйте системный cron или плагин WP Crontrol для запуска cron вручную. - Ошибка: удаляются не все старые заказы.
Причина: неверное сравнение дат или лимит выборки.
Решение: проверьте правильность сравнения с датой и убедитесь, чтоlimit=-1в запросе. - Ошибка: удаление приводит к ошибкам в заказах с зависимостями.
Причина: удаление без проверки связанных данных.
Решение: дополнительно очищайте метаданные и заказы с дочерними объектами, если нужно.
Практические советы по безопасности и производительности
- Удаляйте заказы с осторожностью: убедитесь, что бизнес-процесс допускает удаление, чтобы избежать потери важной информации.
- Для крупных магазинов с тысячами заказов оптимизируйте запросы, обрабатывая заказы порциями, чтобы не перегружать память.
- Используйте WP-CLI для массовых операций, если база очень большая.
- Резервное копирование базы перед внедрением автоматического удаления — обязательный пункт.
Сравнение вариантов решения
| Решение | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагин для очистки заказов | Простота, готовые настройки | Избыточный функционал, нагрузка | Использовать только проверенные плагины |
| Самописный код + WP-Cron | Контроль, легковесность | Требуется навыки, поддержка | Писать читаемый код и комментировать |
| Ручное удаление через WP-CLI | Быстро для разовых задач | Не автоматизировано | Использовать для разовых чисток |