Диагностика проблемы: зачем удалять просроченные заказы в WooCommerce
В интернет-магазинах на WooCommerce часто накапливаются заказы в статусе «Ожидает оплаты» или «Отменён», которые давно не изменяются. Это ведёт к раздутой базе данных, замедлению работы административной панели и усложнению отчетности. Автоматическое удаление таких заказов помогает поддерживать базу в порядке и снижает нагрузку на сервер.
Как понять, что у вас есть просроченные заказы
- В админ-панели WooCommerce откройте Заказы и отфильтруйте по статусам «Ожидает оплаты» (pending) или «Отменён» (cancelled).
- Проверьте дату создания заказа. Если заказ висит больше 7-14 дней без изменений — он считается просроченным.
- Можно быстро найти такие заказы SQL-запросом к базе данных (wp_posts):
SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-cancelled') AND post_date < NOW() - INTERVAL 14 DAY;Пошаговое решение: как автоматически удалять просроченные заказы
1. Создаём функцию удаления просроченных заказов по крону WordPress
Добавьте следующий код в файл functions.php вашей темы или в собственный плагин для кастомных функций:
function wc_delete_expired_orders() {
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-pending', 'wc-cancelled'),
'date_query' => array(
array(
'column' => 'post_date',
'before' => '14 days ago',
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$expired_orders = get_posts($args);
foreach ($expired_orders as $order_id) {
wp_delete_post($order_id, true); // true - удаление без корзины
}
}2. Регистрируем событие wp_cron для регулярного запуска
Чтобы функция запускалась автоматически, зарегистрируем крон-событие. Добавьте следующий код:
function wc_schedule_expired_orders_cleanup() {
if (!wp_next_scheduled('wc_cleanup_expired_orders_hook')) {
wp_schedule_event(time(), 'daily', 'wc_cleanup_expired_orders_hook');
}
}
add_action('wp', 'wc_schedule_expired_orders_cleanup');
add_action('wc_cleanup_expired_orders_hook', 'wc_delete_expired_orders');Проверка результата после внедрения
- Выполните вручную функцию
wc_delete_expired_orders()через отладчик или WP-CLI (wp eval 'wc_delete_expired_orders();') и проверьте, что заказы удалились. - Подождите следующий запуск по расписанию (ежедневно) и убедитесь, что новые просроченные заказы удаляются автоматически.
- Проверьте раздел Заказы в WooCommerce — заказы старше 14 дней с нужными статусами должны исчезнуть.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, зарегистрирован ли крон (wp_cron) на вашем сайте. Для теста можно вызвать функцию вручную.
- Удаляются не те заказы: обратите внимание на фильтр
post_statusи параметрdate_query, они должны точно соответствовать вашей бизнес-логике. - Ошибка прав доступа: функция
wp_delete_postтребует, чтобы текущий пользователь имел соответствующие права. При запуске через крон это обычно не проблема. - Нагрузка на сайт: если заказов очень много, удаляйте их партиями, добавив ограничение
posts_per_pageи реализовав постраничное удаление.
Практические советы по безопасности и производительности
- Перед удалением заказов убедитесь, что нет юридических или бухгалтерских требований хранить их определённый период.
- Создайте резервную копию базы данных перед внедрением автоматического удаления.
- Если количество заказов большое, используйте пакетное удаление, например, по 50 заказов за один проход, чтобы не перегружать сервер:
function wc_delete_expired_orders_batch($batch_size = 50) {
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-pending', 'wc-cancelled'),
'date_query' => array(
array('column' => 'post_date', 'before' => '14 days ago'),
),
'posts_per_page' => $batch_size,
'fields' => 'ids',
);
$expired_orders = get_posts($args);
if (!$expired_orders) return false;
foreach ($expired_orders as $order_id) {
wp_delete_post($order_id, true);
}
return true;
}- Для автоматизации вызовите эту функцию в цикле при нескольких крон-запусках.
- Держите логи удаления для аудита, например, записывая ID удалённых заказов в файл.
Сравнение способов удаления просроченных заказов
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление через админку | Простота, без кода | Трудозатратно, риск пропуска | Малое количество заказов |
| WP-Cron с кастомной функцией (код) | Автоматизация, гибкость, контроль | Нужны знания PHP, настройка крон | Средние и крупные магазины |
| Плагины очистки WooCommerce | Удобство, готовые функции | Зависимость от стороннего кода, нагрузка | Быстрый старт без разработки |