Диагностика проблемы: зачем автоматизировать удаление заказов в WooCommerce
В WooCommerce скапливаются заказы с разными статусами — отменённые, просроченные, неоплаченные. Если их не удалять, база данных растёт, что снижает производительность сайта и затрудняет администрирование. Ручной удаление заказов неудобен и подвержен ошибкам.
Основная задача — автоматически удалять заказы с определёнными статусами, например, отменённые или отложенные, с задержкой в несколько дней, чтобы дать пользователю возможность передумать или исправить оплату.
Пошаговое решение: как настроить автоматическое удаление заказов по статусам с отсрочкой
1. Определяем статусы и задержку удаления
Выберем для примера статусы cancelled и failed. Удалять будем заказы старше 7 дней.
2. Создаём функцию очистки заказов
function wptricks_delete_old_wc_orders() {
$statuses = array('cancelled', 'failed');
$days_old = 7;
$date_before = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));
$args = array(
'post_type' => 'shop_order',
'post_status' => $statuses,
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date_before,
),
),
'fields' => 'ids',
'posts_per_page' => -1,
);
$query = new WP_Query($args);
if (!empty($query->posts)) {
foreach ($query->posts as $order_id) {
wp_delete_post($order_id, true); // true - удаление без корзины
}
}
}3. Запускаем функцию по расписанию через WP-Cron
Регистрируем CRON задачу, которая будет запускать очистку раз в сутки.
function wptricks_schedule_order_cleanup() {
if (!wp_next_scheduled('wptricks_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wptricks_daily_order_cleanup');
}
}
add_action('wp', 'wptricks_schedule_order_cleanup');
add_action('wptricks_daily_order_cleanup', 'wptricks_delete_old_wc_orders');Проверка результата после внедрения
- Проверить наличие запланированной задачи в разделе
wp cron event list(через WP-CLI или плагин WP Crontrol). - Создать тестовые заказы со статусами
cancelledиfailed, датированные старше 7 дней (можно вручную изменить дату в базе или через SQL). - Запустить CRON вручную:
do_action('wptricks_daily_order_cleanup');и проверить, что тестовые заказы удалились. - Отслеживать логи ошибок PHP и WooCommerce на предмет проблем с удалением.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что CRON запускается (используйте WP Crontrol), функция
wp_delete_postвызывается, и статусы совпадают. - Удаляется не тот набор заказов: проверьте параметры WP_Query, особенно
post_statusиdate_query. Статусы должны быть массивом. - Проблемы с производительностью при большом количестве заказов: используйте пагинацию в запросе, чтобы удалить партии заказов по 100 штук за раз.
- CRON не запускается на хостинге: настройте системный cron, который вызывает wp-cron.php или используйте плагин для имитации cron.
Практические советы по безопасности и производительности
- Удаление заказов без возврата в корзину (
wp_delete_post($order_id, true)) — более жёсткий метод, но освобождающий место сразу. - Перед удалением можно добавить логирование в файл, чтобы отслеживать удалённые ID заказов.
- Для больших магазинов с тысячами заказов лучше запускать удаление партиями с ограничением по времени и нагрузке.
- Регулярно оптимизируйте базу данных после массового удаления заказов.
Пример расширенного удаления с пагинацией и логированием
function wptricks_delete_old_wc_orders_batch( $batch_size = 100 ) {
$statuses = array('cancelled', 'failed');
$days_old = 7;
$date_before = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));
$args = array(
'post_type' => 'shop_order',
'post_status' => $statuses,
'date_query' => array(
array('column' => 'post_date', 'before' => $date_before),
),
'fields' => 'ids',
'posts_per_page' => $batch_size,
);
$query = new WP_Query($args);
if (!empty($query->posts)) {
foreach ($query->posts as $order_id) {
if (wp_delete_post($order_id, true)) {
error_log("Deleted WooCommerce order ID: {$order_id}");
}
}
}
return count($query->posts);
}
function wptricks_daily_order_cleanup() {
$batch_size = 100;
do {
$deleted = wptricks_delete_old_wc_orders_batch($batch_size);
} while ($deleted === $batch_size);
}
add_action('wp', function() {
if (!wp_next_scheduled('wptricks_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wptricks_daily_order_cleanup');
}
});
add_action('wptricks_daily_order_cleanup', 'wptricks_daily_order_cleanup');Сравнение методов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Удаление единичных заказов вручную | Простота, контроль | Долго, неудобно для больших объёмов |
| WP_Query + wp_delete_post с CRON | Автоматизация, гибкость, подходит для сотен заказов | Потребляет ресурсы, требует настройки CRON |
| SQL-запросы напрямую к базе | Скорость, минимальная нагрузка | Риск повреждения данных, требует осторожности |