Что такое неактивные корзины в WooCommerce и почему их стоит удалять?
В WooCommerce корзины создаются автоматически, когда пользователь добавляет товар, но не оформляет заказ. Такие корзины накапливаются в базе данных как записи типа shop_order со статусом wc-pending или специальным метаполем корзины. Они занимают место и влияют на производительность, особенно на крупных магазинах.
Диагностика проблемы: как определить наличие неактивных корзин
Для начала нужно проверить, сколько заказов в базе — сколько из них открытые, но без перехода к оплате.
Пример SQL-запроса для подсчёта заказов со статусом wc-pending старше 7 дней:
SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending' AND post_date < NOW() - INTERVAL 7 DAY;Если число высокое, стоит автоматизировать удаление таких корзин.
Пошаговое решение: создание WP-Cron задачи для удаления старых неактивных корзин
1. Регистрация собственного периода для WP-Cron (например, раз в сутки)
add_filter('cron_schedules', function($schedules) {
if (!isset($schedules['daily_custom'])) {
$schedules['daily_custom'] = [
'interval' => 86400, // 24 часа
'display' => __('Каждый день')
];
}
return $schedules;
});2. Запланировать событие при активации плагина или темы
register_activation_hook(__FILE__, function() {
if (!wp_next_scheduled('wpunit_delete_old_carts')) {
wp_schedule_event(time(), 'daily_custom', 'wpunit_delete_old_carts');
}
});
register_deactivation_hook(__FILE__, function() {
wp_clear_scheduled_hook('wpunit_delete_old_carts');
});3. Функция удаления корзин старше 7 дней
add_action('wpunit_delete_old_carts', function() {
global $wpdb;
$days = 7;
$threshold_date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Выбираем ID заказов в статусе wc-pending старше threshold_date
$order_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-pending' AND post_date < %s",
$threshold_date
));
if (!empty($order_ids)) {
foreach ($order_ids as $order_id) {
wp_delete_post($order_id, true); // Полное удаление
}
}
});Проверка результата после внедрения решения
- Подождите 24 часа после активации и проверьте количество заказов со статусом
wc-pendingстарше 7 дней SQL-запросом из раздела диагностики. - Для немедленной проверки можно вручную запустить функцию из консоли WP-CLI или временно вызвать хук в коде:
do_action('wpunit_delete_old_carts');- Убедитесь, что старые неактивные корзины удалились из базы.
Частые ошибки при автоматическом удалении корзин и способы их исправления
- Удаление заказов с другим статусом: ошибочный фильтр статуса может привести к удалению активных или оплаченных заказов. Всегда проверяйте статус
wc-pending. - Проблемы с WP-Cron: если WP-Cron не запускается (например, из-за отсутствия посещений сайта), задача не сработает. Для стабильности используйте реальный системный cron или плагин для запуска WP-Cron по расписанию.
- Удаление заказов с незавершёнными платежами: если магазин использует сторонние платежные шлюзы, проверьте, не помешает ли удаление обработке платежей. Возможно, стоит увеличить период хранения корзин.
Практические советы по безопасности и производительности
- Удаляйте только заказы со статусом
wc-pending, чтобы не повредить данные пользователей и статистику. - Добавьте в код логирование количества удалённых заказов для контроля и отладки.
- Если заказов много, удаляйте партиями (например, по 50), чтобы не перегружать сервер и избежать ошибок таймаута.
- Рассмотрите использование плагина Clearfy Pro для автоматизации и расширенной очистки базы WooCommerce с возможностью тонких настроек: https://wpshop.ru/plugins/clearfy
Сравнение способов удаления неактивных корзин WooCommerce
| Способ | Плюсы | Минусы | Рекомендуется для |
|---|---|---|---|
| WP-Cron с кастомным кодом | Полный контроль, бесплатный, гибкий | Зависит от работы WP-Cron, требует навыков разработки | Разработчики, магазины с уникальными условиями |
| Плагины очистки базы (например, Clearfy Pro) | Простота настройки, дополнительные функции оптимизации | Платные, ограниченная кастомизация | Администраторы без навыков программирования |
| Ручное удаление через phpMyAdmin или SQL | Быстро и точно при необходимости | Риск ошибок, требует знаний SQL, не автоматизировано | Экстренные случаи, администраторы БД |