Диагностика проблемы: зачем удалять неактивные заказы в WooCommerce
В интернет-магазинах на WooCommerce накапливаются заказы, которые не были оплачены или заброшены пользователями. Такие неактивные заказы занимают место в базе данных, ухудшают производительность и мешают аналитике. Автоматическое удаление таких заказов освобождает ресурсы и упрощает управление.
Что считать неактивным заказом
Обычно под неактивными понимают заказы со статусами pending, failed, cancelled, которые не изменялись долгое время (например, более 7 дней). Важно не удалять заказы с оплатой или обработкой.
Как проверить наличие неактивных заказов
SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-cancelled') AND post_date < NOW() - INTERVAL 7 DAY;Эта команда SQL покажет заказы, подходящие под критерии удаления.
Пошаговое решение: автоматическое удаление неактивных заказов
1. Создаем функцию для удаления
Добавьте в файл functions.php вашей темы или в кастомный плагин следующий код:
function wppartner_delete_inactive_orders() {
$days = 7; // количество дней неактивности
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = array(
'limit' => -1,
'status' => array('pending', 'failed', 'cancelled'),
'date_created' => '<' . $date,
);
$orders = wc_get_orders($args);
foreach ( $orders as $order ) {
$order->delete(true); // true - удаляет полностью, включая метаданные
}
}2. Настраиваем CRON-задачу для регулярного запуска
Добавьте хук, который запустит функцию ежедневно:
if ( ! wp_next_scheduled( 'wppartner_daily_delete_inactive_orders' ) ) {
wp_schedule_event( time(), 'daily', 'wppartner_daily_delete_inactive_orders' );
}
add_action( 'wppartner_daily_delete_inactive_orders', 'wppartner_delete_inactive_orders' );3. Ручной запуск и тестирование
Для проверки работы запустите вручную:
wppartner_delete_inactive_orders();Или выполните в консоли WP-CLI:
wp eval 'wppartner_delete_inactive_orders();'Проверка результата после внедрения
Проверьте базу заказов через админку WooCommerce — неактивных заказов должно стать меньше или они исчезнут. Также можно выполнить SQL-запрос из раздела диагностики, чтобы убедиться, что старые заказы удалены.
Частые ошибки и как их исправить
- Не удаляются заказы: проверьте, что статусы заказов указаны корректно с префиксом
wc-(например,wc-pending). Вwc_get_ordersнужно указывать без префикса, как в примере выше. - CRON-задача не выполняется: убедитесь, что WP-Cron включен и работает. Для теста запустите
wp cron event run --due-nowчерез WP-CLI. - Удаляются важные заказы: внимательно настройте фильтр по датам и статусам, чтобы не затронуть обработанные заказы.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы данных перед внедрением автоматических удалений.
- Используйте параметр
limitпри большом количестве заказов, чтобы удалять партиями (например, по 100), чтобы не создавать нагрузку. - Для сайтов с большим трафиком и базой используйте системный CRON вместо WP-Cron для надежности.
- Логируйте удаляемые заказы в файл для аудита:
function wppartner_delete_inactive_orders() {
$days = 7;
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = array(
'limit' => -1,
'status' => array('pending', 'failed', 'cancelled'),
'date_created' => '<' . $date,
);
$orders = wc_get_orders($args);
$log_file = __DIR__ . '/deleted_orders.log';
foreach ( $orders as $order ) {
$id = $order->get_id();
$date_created = $order->get_date_created()->date('Y-m-d H:i:s');
$order->delete(true);
file_put_contents($log_file, "Deleted order ID: $id, Date: $date_created\n", FILE_APPEND);
}
}Сравнение методов удаления неактивных заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Удаление через WP-Cron (как в статье) | Автоматизация, не требует внешних сервисов | Зависит от посещаемости сайта, нагрузка при большом количестве заказов |
| Системный CRON + WP-CLI | Надежность, можно запускать в оптимальное время | Требует SSH доступа и навыков работы с сервером |
| Плагины очистки базы | Простота настройки, интерфейс | Риск удаления лишнего, нагрузка на сайт, зависимость от обновлений плагина |