Диагностика проблемы с долгими брошенными корзинами и автозакрытием заказов
Пользователи WooCommerce часто сталкиваются с проблемой накопления брошенных корзин, которые не очищаются автоматически. Это приводит к "зависшим" товарам в корзине, увеличению нагрузки на базу данных и путанице в заказах. Кроме того, WooCommerce по умолчанию может закрывать не завершённые заказы через определённое время, что мешает клиентам, если они хотят вернуться к оплате позже.
Чтобы диагностировать проблему, проверьте:
- Сколько записей в таблице
wp_woocommerce_sessionsиwp_postsс типом'shop_order'и статусами'pending','failed'. - Наличие плагинов, которые управляют сессиями или заказами.
- Сколько времени хранится корзина и как настроено время сессии WooCommerce (
wc_session_expiringиwc_session_expirationв куках).
Пошаговое решение: автоматическое очищение корзины и отключение автозакрытия заказов
1. Очистка брошенных корзин с помощью WP-Cron
Добавим функцию, которая удаляет устаревшие сессии WooCommerce и заказы со статусом pending старше определённого времени.
add_action('wp', function() {
if (!wp_next_scheduled('custom_cleanup_woocommerce_sessions')) {
wp_schedule_event(time(), 'hourly', 'custom_cleanup_woocommerce_sessions');
}
});
add_action('custom_cleanup_woocommerce_sessions', function() {
global $wpdb;
// Удаляем сессии старше 48 часов
$expiration = time() - 48 * HOUR_IN_SECONDS;
$wpdb->query(
$wpdb->prepare(
"DELETE FROM {$wpdb->options} WHERE option_name LIKE '_wc_session_%%' AND option_value LIKE %s",
'%' . gmdate('Y-m-d H:i:s', $expiration) . '%'
)
);
// Удаляем заказы в статусе pending старше 48 часов
$orders = wc_get_orders([
'limit' => -1,
'status' => 'pending',
'date_created' => '<' . (new WC_DateTime('@' . $expiration))->format('Y-m-d H:i:s'),
'return' => 'ids',
]);
foreach ($orders as $order_id) {
wp_trash_post($order_id);
}
});2. Отключение автоматического автозакрытия заказов в WooCommerce
WooCommerce не закрывает заказы автоматически, если не настроено дополнительно. Однако некоторые плагины или кастомный код могут добавлять такую логику. Чтобы гарантированно отключить автозакрытие, можно использовать фильтр 'woocommerce_auto_cancel_pending_orders_interval' и вернуть false, чтобы отмена не происходила.
add_filter('woocommerce_auto_cancel_pending_orders_interval', '__return_false');Проверка результата после внедрения
- Запустите вручную cron-задачу через WP-CLI:
wp cron event run custom_cleanup_woocommerce_sessions. - Проверьте таблицу
wp_options, что записи сессий старше 48 часов удалены. - В админке WooCommerce проверьте, что заказы со статусом
pendingстарше 48 часов переместились в корзину или удалены. - Создайте заказ и оставьте в статусе
pending, через 2 дня он не должен быть отменён автоматически.
Частые ошибки и как их исправить
- Ошибка: WP-Cron не запускается автоматически.
Решение: Настройте системный cron на сервере или используйте плагин WP Crontrol для ручного запуска. - Ошибка: Сессии не удаляются.
Причина: Неправильный SQL-запрос или использование устаревшего префикса таблиц.
Решение: Используйте $wpdb->options и проверяйте префикс базы, корректируйте под вашу установку. - Ошибка: Автоматическое закрытие заказов всё ещё происходит.
Решение: Проверьте дополнительные плагины и их настройки, ищите хукwoocommerce_auto_cancel_pending_orders_intervalили кастомный код.
Практические советы по безопасности и производительности
- Не удаляйте сессии слишком часто, это может привести к проблемам с пользователями, которые возвращаются в корзину.
- Для больших интернет-магазинов используйте отдельный системный cron для запуска WP-Cron, чтобы избежать задержек.
- Храните резервные копии базы данных перед массовым удалением заказов и сессий.
- По возможности используйте плагин Clearfy Pro (ссылка) для расширенной оптимизации и управления сессиями WooCommerce.