Диагностика проблемы: зачем удалять неактивные заказы в WooCommerce
В интернет-магазинах на WooCommerce со временем накапливаются заказы со статусами, которые не продвигаются дальше — например, «ожидает оплаты» или «отменён». Они занимают место в базе данных, замедляют работу админки и усложняют аналитику. Автоматическое удаление таких заказов помогает поддерживать базу компактной и чистой.
Определяем критерии для удаления
Прежде чем реализовывать удаление, нужно чётко определить, какие заказы считаются «неактивными» и через какой срок их можно удалять.
- Статусы заказа: чаще всего это «pending» (ожидает оплаты), «failed» (неудачный), «cancelled» (отменён).
- Срок неактивности: например, 30 дней с момента создания заказа.
Эти параметры можно адаптировать под любую бизнес-логику.
Как реализовать автоматическое удаление заказов в WooCommerce
Самый надёжный способ — использовать WP Cron для периодического запуска функции, которая будет искать и удалять старые заказы с нужными статусами.
Код для удаления неактивных заказов
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wpb_delete_old_inactive_orders() {
$days = 30; // сколько дней считать заказ неактивным
$statuses = array('pending', 'failed', 'cancelled');
$date_query = array(
'column' => 'post_date',
'before' => sprintf('- %d days', $days),
'inclusive' => true,
);
$args = array(
'post_type' => 'shop_order',
'post_status' => array_map( function($status) { return 'wc-' . $status; }, $statuses ),
'date_query' => array($date_query),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_trash_post($order_id); // сначала отправляем в корзину
// можно использовать wp_delete_post($order_id, true); чтобы удалять сразу
}
}
}
// Создаём событие, если его ещё нет
if (! wp_next_scheduled('wpb_daily_delete_inactive_orders') ) {
wp_schedule_event(time(), 'daily', 'wpb_daily_delete_inactive_orders');
}
// Хук для запуска
add_action('wpb_daily_delete_inactive_orders', 'wpb_delete_old_inactive_orders');Объяснение кода
- Определяем переменную
$days— заказы старше этого количества дней будут удалены. - Формируем массив статусов заказов для удаления, добавляя префикс
wc-, который используется в статусах WooCommerce. - С помощью
get_postsполучаем ID заказов, соответствующих условиям. - Удаляем заказы с помощью
wp_trash_post, так безопаснее — можно восстановить из корзины. Если нужна полная очистка, используйтеwp_delete_postс параметромtrue. - Для автоматического запуска создаём событие WP Cron, которое будет выполняться ежедневно.
Как проверить, что автоматическое удаление работает
- Создайте тестовые заказы с статусами
pending,failed,cancelledи датой создания более 30 дней назад. - Вручную запустите функцию через WP CLI или временно добавьте вызов
wpb_delete_old_inactive_orders();вfunctions.php. - Проверьте, что заказы переместились в корзину (раздел «Корзина» в заказах WooCommerce) или удалены, если использовался
wp_delete_post. - Для проверки работы WP Cron можно использовать плагин WP Crontrol — там увидеть запланированные задачи и запускать их вручную.
Частые ошибки и как их исправить
- Удаляются не те заказы. Проверьте, что статусы в массиве
$statusesкорректны и с префиксомwc-. Например,wc-pending, а не простоpending. - Заказы не удаляются. Возможно, WP Cron не работает. Проверьте, активен ли
DISABLE_WP_CRONвwp-config.php. Если да, настройте системный cron на вызовwp-cron.phpили запускайте функцию вручную. - Удаление происходит слишком часто или слишком редко. Проверьте интервал запуска задачи
wp_schedule_event— в примере стоитdaily. Можно изменить наhourlyили кастомный интервал. - Удаление вызывает сбои в работе сайта. Убедитесь, что удаление происходит в безопасное время и не блокирует другие процессы. Можно добавить логирование удалённых заказов для отладки.
Практические советы по безопасности и производительности
- Используйте
wp_trash_postвместо немедленного удаления, чтобы иметь возможность восстановить случайно удалённые заказы. - Добавьте логирование удалённых заказов, например, в отдельный файл или в таблицу базы данных для аудита.
- Проверьте, что удаление заказов не влияет на связанные данные, например, на отчёты или интеграции с CRM.
- Если заказов очень много, разбивайте удаление на порции — например, не более 100 заказов за один запуск, чтобы избежать таймаута PHP.
Сравнение способов удаления заказов
| Метод | Плюсы | Минусы | Рекомендуемость |
|---|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудоёмко, не автоматизировано | Для редких случаев |
| Плагин для очистки заказов (например, WooCommerce Order Cleaner) | Удобный интерфейс, настройки | Дополнительная нагрузка, зависимость от сторонних решений | Для магазинов без кастомных требований |
| Код с WP Cron (пример из статьи) | Полный контроль, интеграция в код | Требует навыков, настройка cron | Лучший вариант для разработчиков |