Почему важно удалять несоверешённые заказы в WooCommerce
В WooCommerce несоверешённые заказы (статусы pending, failed или on-hold) могут накапливаться, занимая место в базе данных и замедляя работу магазина. Особенно это актуально для магазинов с большим трафиком и частыми брошенными корзинами. Автоматическое удаление таких заказов помогает поддерживать базу в чистоте и повышать производительность.
Диагностика проблемы: как понять, что заказы нужно удалять
Для начала проверьте, сколько заказов с неподтвержденным статусом накопилось в базе. Это можно сделать через phpMyAdmin или WP-CLI:
wp db query "SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;"Если в статусах wc-pending, wc-failed или wc-on-hold тысячи записей, это сигнал к очистке.
Пошаговое решение: скрипт для автоматического удаления несоверешённых заказов
1. Создаем функцию для удаления заказов старше заданного времени
function wpabout_delete_old_uncompleted_orders() {
global $wpdb;
$interval = 7; // количество дней
$statuses = ['wc-pending', 'wc-failed', 'wc-on-hold'];
foreach ($statuses as $status) {
$orders = wc_get_orders(array(
'limit' => -1,
'status' => $status,
'date_created' => '<' . (time() - DAY_IN_SECONDS * $interval),
'return' => 'ids',
));
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — удалить безвозвратно
}
}
}2. Запускаем функцию по расписанию через WP-Cron
function wpabout_schedule_order_cleanup() {
if (!wp_next_scheduled('wpabout_order_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'wpabout_order_cleanup_hook');
}
}
add_action('wp', 'wpabout_schedule_order_cleanup');
add_action('wpabout_order_cleanup_hook', 'wpabout_delete_old_uncompleted_orders');3. Отключение планировщика (если понадобится)
function wpabout_clear_order_cleanup_schedule() {
$timestamp = wp_next_scheduled('wpabout_order_cleanup_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpabout_order_cleanup_hook');
}
}Проверка результата после внедрения
- Подождите 24 часа или запустите событие вручную через WP-CLI:
wp cron event run wpabout_order_cleanup_hook - Проверьте количество заказов с нужными статусами в админке WooCommerce или через запрос в базу (см. диагностику)
- Убедитесь, что заказы старше 7 дней действительно удалены
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, активен ли WP-Cron и работает ли расписание (
wp cron event list). - Удаляются не те заказы: проверьте условие даты в
wc_get_orders, используйте правильный формат даты (объект DateTime или 'Y-m-d H:i:s'). - Проблемы с правами: убедитесь, что функция вызывается с необходимыми правами, и что
wp_delete_postне блокируется плагинами безопасности. - Перегрузка базы при большом количестве заказов: разбейте удаление на порции по 50-100 заказов за один запуск.
Чек-лист для внедрения автоматической очистки заказов
- Определите статусы заказов для удаления и период хранения
- Напишите функцию удаления заказов с проверкой даты
- Настройте WP-Cron для периодического запуска
- Проверьте работу крона и корректность удаления
- Оптимизируйте код для больших баз (пакетная обработка)
- Резервируйте базу перед внедрением
Практические советы по безопасности и производительности
- Обязательно выполняйте резервное копирование базы перед автоматическим удалением.
- Используйте пакетную обработку, если заказов слишком много, чтобы избежать таймаутов.
- Контролируйте работу WP-Cron, особенно на хостингах с отключённым системным cron.
- Можно расширить функционал через Clearfy Pro для очистки и оптимизации базы данных https://wpshop.ru/plugins/clearfy.
Таблица сравнения способов удаления несоверешённых заказов
| Метод | Плюсы | Минусы | Использование |
|---|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудозатратно, риск пропуска | Малые магазины |
| WP-Cron + скрипт (код) | Автоматизация, гибкость | Нужна настройка, возможны ошибки | Средние и крупные магазины |
| Плагины очистки (например, Clearfy) | Удобство, комплексная оптимизация | Может быть платным, влияние на производительность | Все уровни |