Диагностика проблемы: почему корзина и сессии не очищаются после заказа
По умолчанию WooCommerce очищает корзину после успешного оформления заказа. Однако в некоторых случаях корзина может оставаться заполненной, что приводит к путанице у пользователей и увеличению нагрузки на сервер из-за хранения лишних сессий. Чаще всего это происходит из-за конфликтов с плагинами, кастомным кодом, или нестандартными темами, которые переопределяют поведение WooCommerce.
Проверьте, существует ли проблема у вас, открыв в браузере консоль разработчика (F12) и вкладку Network. После оформления заказа убедитесь, что запросы на удаление сессий и очистку корзины выполняются. Если корзина не очищается, то запросы либо не отправляются, либо обработчик не срабатывает.
Пошаговое решение: гарантируем очистку корзины и сессий после оформления заказа
Шаг 1. Используем хук woocommerce_thankyou для очистки корзины
Добавьте следующий код в файл functions.php вашей темы или в плагин для кастомных функций:
add_action('woocommerce_thankyou', 'custom_clear_cart_after_order', 20, 1);
function custom_clear_cart_after_order( $order_id ) {
if ( ! $order_id ) {
return;
}
$order = wc_get_order( $order_id );
if ( ! $order ) {
return;
}
// Очистка корзины
WC()->cart->empty_cart();
// Очистка сессии пользователя
if ( WC()->session ) {
WC()->session->destroy_session();
}
}Этот код срабатывает на странице благодарности после оформления заказа и очищает корзину и сессию пользователя.
Шаг 2. Отключаем потенциально конфликтующие плагины и проверяем тему
Если после добавления кода проблема не исчезла, временно отключите все плагины, кроме WooCommerce, и переключитесь на стандартную тему (например, Storefront). Проверьте поведение корзины. Если очистка работает, значит проблема в конфликте. Включайте плагины и тему по одному, чтобы выявить виновника.
Шаг 3. Принудительно удаляем сессии на сервере
Если проблема связана с хранением старых сессий, можно использовать WP-Cron для периодической очистки сессий WooCommerce:
if ( ! wp_next_scheduled( 'custom_wc_cleanup_sessions' ) ) {
wp_schedule_event( time(), 'hourly', 'custom_wc_cleanup_sessions' );
}
add_action( 'custom_wc_cleanup_sessions', 'custom_wc_cleanup_sessions_function' );
function custom_wc_cleanup_sessions_function() {
global $wpdb;
$session_lifetime = 48 * HOUR_IN_SECONDS; // 48 часов
$time_limit = time() - $session_lifetime;
$wpdb->query( $wpdb->prepare(
"DELETE FROM {$wpdb->prefix}woocommerce_sessions WHERE session_expiry < %d",
$time_limit
) );
}Этот код добавляет задачу, которая раз в час удаляет устаревшие сессии, уменьшая нагрузку и предотвращая накопление мусора.
Проверка результата после внедрения
- Оформите тестовый заказ на сайте.
- После перехода на страницу «Спасибо за заказ» убедитесь, что корзина пуста (через интерфейс и в консоли браузера).
- Проверьте таблицу
wp_woocommerce_sessionsв базе данных — записи для сессии должны обновляться или удаляться со временем. - Повторите тест с разными ролями пользователей и без авторизации.
Частые ошибки и как их исправить
- Код очистки корзины не срабатывает: возможно, хук
woocommerce_thankyouпереопределён в теме или плагинах. Используйте отладку черезerror_log, чтобы проверить вызов функции. - Очистка сессий не происходит: убедитесь, что у вас включена стандартная сессия WooCommerce (
WC()->sessionне равенnull), иначе код очистки не выполнится. - Удаление сессий приводит к ошибкам в заказах: не удаляйте сессии сразу, делайте это с задержкой (например, только для сессий старше 48 часов).
- Пользователи видят старую корзину после оформления заказа: проверьте кеширование страниц и отключите кеширование для страниц корзины и оформления заказа.
Практические советы по безопасности и производительности
- Не используйте принудительное удаление сессий в реальном времени — это может привести к потере данных. Лучше делать это с помощью WP-Cron с интервалом не чаще часа.
- Включите Object Cache (например, Redis) для ускорения работы с сессиями WooCommerce. Можно настроить с помощью плагина Clearfy.
- Отключите кеширование страниц корзины и оформления заказа в вашем плагине кеша или серверной конфигурации, чтобы избежать конфликтов с сессиями.
- Регулярно проверяйте базу данных на предмет устаревших сессий и ревизий, чтобы поддерживать производительность.
Сравнение вариантов очистки корзины и сессий
| Метод | Плюсы | Минусы |
|---|---|---|
Хук woocommerce_thankyou | Прост в реализации, срабатывает сразу после заказа | Может конфликтовать с темами/плагинами |
| WP-Cron для очистки сессий | Удаляет устаревшие сессии, снижает нагрузку | Не удаляет сессии мгновенно, требует настроенного Cron |
| Отключение кеширования страниц корзины/чекаута | Избегает отображения устаревших данных | Может снизить производительность сайта |