Что такое забытые корзины в WooCommerce и почему их нужно удалять
Забытые корзины — это неоконченное оформление заказа, когда пользователь добавил товары в корзину, но не завершил покупку. Они занимают ресурсы базы данных, могут замедлять сайт и влиять на аналитику. WooCommerce хранит такие корзины в таблице wp_woocommerce_sessions, и их автоматическое удаление помогает поддерживать производительность и чистоту данных.
Диагностика проблемы с накоплением забытых корзин
Чтобы проверить, есть ли проблема с забытыми корзинами, выполните в базе данных следующий запрос (через phpMyAdmin или WP CLI):
SELECT COUNT(*) FROM wp_woocommerce_sessions;Если число записей превышает несколько сотен или тысяч, а на сайте мало активных пользователей, значит корзины не очищаются автоматически.
Также можно проверить дату последнего обновления сессий:
SELECT session_id, session_expiry FROM wp_woocommerce_sessions ORDER BY session_expiry DESC LIMIT 10;Если в таблице есть сессии с истекшим временем хранения, они должны автоматически удаляться. Если этого не происходит — есть проблема.
Пошаговое решение: автоматическое удаление забытых корзин в WooCommerce с помощью кода
1. Добавляем CRON-задачу для регулярной очистки
WooCommerce не очищает корзины автоматически по умолчанию с нужной периодичностью, поэтому реализуем собственный CRON.
add_action('wp_loaded', function() {
if (!wp_next_scheduled('wc_custom_cleanup_sessions')) {
wp_schedule_event(time(), 'hourly', 'wc_custom_cleanup_sessions');
}
});2. Создаем функцию удаления сессий с истекшим сроком
add_action('wc_custom_cleanup_sessions', function() {
global $wpdb;
$table = $wpdb->prefix . 'woocommerce_sessions';
$time = time();
$deleted = $wpdb->query($wpdb->prepare(
"DELETE FROM $table WHERE session_expiry < %d",
$time
));
if ($deleted !== false) {
error_log('WooCommerce: удалено ' . $deleted . ' забытых корзин');
}
});3. Отключаем дублирующие очистки (если есть)
Если вы используете плагины или темы, которые самостоятельно очищают корзины, убедитесь, что они не конфликтуют с вашим кодом.
Как проверить, что решение работает
- Запустите CRON вручную через WP CLI:
wp cron event run wc_custom_cleanup_sessions - Проверьте логи ошибок PHP или debug.log, ищите записи «WooCommerce: удалено».
- Повторите запрос к базе:
и убедитесь, что количество сессий уменьшилось.SELECT COUNT(*) FROM wp_woocommerce_sessions; - Следите за базой данных после нескольких часов работы CRON — число забытых корзин должно сокращаться.
Частые ошибки и как их исправить
- CRON не запускается: проверьте, что WP CRON включен и работает. Для проверки запустите команду
wp cron event listи убедитесь, что событиеwc_custom_cleanup_sessionsзапланировано. - Ошибка доступа к базе данных: убедитесь, что у пользователя базы данных есть права на удаление из таблицы
wp_woocommerce_sessions. - Привязка к неправильному префиксу таблиц: используйте глобальную переменную
$wpdb->prefixдля динамического определения префикса. - Конфликты с другими плагинами: временно деактивируйте сторонние плагины, которые могут управлять сессиями, чтобы выявить конфликт.
Практические советы по безопасности и производительности
- Запускайте очистку не чаще, чем раз в час, чтобы не нагружать базу.
- Включите логирование удаления корзин для контроля.
- Если база большая — используйте пагинацию удаления по частям, чтобы избежать таймаутов.
- Регулярно делайте резервные копии базы перед изменениями.
Альтернативные варианты очистки забытых корзин: сравнение
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Ручной SQL-запрос | Быстро, без плагинов | Требует доступа к БД, риск ошибок | |
| CRON-задача с PHP (описанный метод) | Автоматизация, интеграция в WP | Нужно следить за CRON, требует кода | Код из статьи |
| Плагин для очистки сессий | Простота установки | Может конфликтовать, нагрузка | Например, WP Rocket (частично) |