Диагностика проблемы: зачем удалять неоплаченные заказы в WooCommerce
В стандартной установке WooCommerce неоплаченные заказы (например, со статусом pending или failed) накапливаются в базе данных без ограничения по времени. Это может приводить к росту объёма базы, снижению производительности и запутыванию в отчетах. Особенно актуально для магазинов с высоким трафиком и большим количеством брошенных корзин.
Шаги для автоматического удаления неоплаченных заказов
1. Определяем статус и период удаления
Для начала нужно определиться, какие заказы считать «неоплаченными» и сколько времени они могут храниться. Обычно это статусы pending и failed, а срок — 24 часа или 48 часов.
2. Создаем функцию для удаления заказов
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
function wpid_delete_unpaid_orders() {
$statuses = array('pending', 'failed');
$date_threshold = (new DateTime())->modify('-24 hours')->format('Y-m-d H:i:s');
$args = array(
'post_type' => 'shop_order',
'post_status' => $statuses,
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date_threshold,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $order_id) {
wp_delete_post($order_id, true); // принудительно удаляет заказ
}
}
}3. Запускаем функцию по расписанию через WP-Cron
Добавьте хук для запуска проверки, например, раз в час:
if (!wp_next_scheduled('wpid_hourly_delete_unpaid_orders')) {
wp_schedule_event(time(), 'hourly', 'wpid_hourly_delete_unpaid_orders');
}
add_action('wpid_hourly_delete_unpaid_orders', 'wpid_delete_unpaid_orders');Проверка результата после внедрения
- Закажите тестовый товар и не оплачивайте его.
- Убедитесь, что заказ создается со статусом
pendingилиfailed. - Подождите 24 часа или измените значение в коде на более короткий срок для теста (например,
-1 hour). - Проверьте через админку WooCommerce, что заказ удалился.
- Проверьте таблицу
wp_postsна наличие удаленного заказа (запрос SQL).
Частые ошибки и их исправление
- Заказы не удаляются: убедитесь, что WP-Cron работает на вашем сервере. Для проверки используйте плагин WP Crontrol.
- Удаляются не те заказы: проверьте, что статусы в массиве
$statusesправильно заданы, и что дата сравнивается с полемpost_date. - Ошибка с правами: функция
wp_delete_postтребует прав администратора, убедитесь, что код запускается от имени пользователя с нужными правами или в фоне. - Повышенная нагрузка при большом количестве заказов: если заказов много, добавьте пагинацию в WP_Query и удаляйте партии по 50-100 штук за вызов.
Практические советы по безопасности и производительности
- Всегда делайте резервное копирование базы перед внедрением автоматического удаления.
- Для крупных магазинов лучше использовать WP-CLI скрипты для пакетной очистки заказов.
- Регулярно проверяйте логи сервера и WooCommerce на наличие ошибок.
- В продакшене избегайте слишком частого запуска удаления, достаточно один раз в час или в сутки.
Сравнение вариантов реализации удаления неоплаченных заказов
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron + кастомный код | Гибкость, можно настроить по времени и статусам | Зависит от работы WP-Cron, может не сработать на слабых хостингах | Код из статьи |
| Плагины для очистки заказов (например, WooCommerce Order Cleaner) | Простота установки и настройки | Меньше контроля, могут удалять не те заказы | Плагин WooCommerce Order Cleaner |
| WP-CLI скрипты | Высокая производительность при больших объемах | Требуется доступ к терминалу сервера | wp post delete $(wp post list --post_type=shop_order --post_status=pending --date_query='before=24 hours ago' --format=ids) |