Что такое корзины (сессии) в WooCommerce и зачем их удалять
WooCommerce сохраняет содержимое корзины для каждого пользователя в сессиях, которые по умолчанию хранятся в базе данных и в куках браузера. При этом, если пользователь не завершил покупку, эти сессии могут накапливаться, занимая место в базе данных и замедляя работу сайта. Особенно это актуально для высоконагруженных магазинов с большим трафиком.
Автоматическое удаление старых корзин позволяет:
- Снизить размер таблиц базы данных, в частности
wp_woocommerce_sessions; - Улучшить скорость обработки запросов к сессиям;
- Поддерживать базу данных в чистоте без лишних записей.
Диагностика накопления старых сессий WooCommerce
Для начала проверьте, сколько сессий хранится в базе. Для этого можно выполнить SQL-запрос напрямую через phpMyAdmin или консоль:
SELECT COUNT(*) AS total_sessions FROM wp_woocommerce_sessions;Если число сессий превышает сотни тысяч, это сигнал к необходимости очистки.
Также можно проверить дату последнего обновления сессий:
SELECT session_id, session_expiry FROM wp_woocommerce_sessions ORDER BY session_expiry ASC LIMIT 10;Это покажет самые старые сессии и их время истечения.
Пошаговое решение: удаление старых корзин через кастомный код
WooCommerce хранит сессии в таблице wp_woocommerce_sessions с полем session_expiry — время истечения сессии в формате UNIX timestamp. Чтобы удалить устаревшие сессии, нужно удалить записи с session_expiry меньше текущего времени.
Добавим функцию, которая будет запускаться раз в сутки с помощью WP-Cron и удалять просроченные сессии.
Код для удаления просроченных сессий
function wptemp_clear_expired_woocommerce_sessions() {
global $wpdb;
$table = $wpdb->prefix . 'woocommerce_sessions';
$now = time();
$deleted = $wpdb->query(
$wpdb->prepare("DELETE FROM $table WHERE session_expiry < %d", $now)
);
if (false === $deleted) {
error_log('Ошибка при удалении просроченных сессий WooCommerce');
} else {
error_log('Удалено ' . $deleted . ' просроченных сессий WooCommerce');
}
}
// Планируем запуск задачи раз в сутки
if (!wp_next_scheduled('wptemp_daily_clear_woocommerce_sessions')) {
wp_schedule_event(time(), 'daily', 'wptemp_daily_clear_woocommerce_sessions');
}
add_action('wptemp_daily_clear_woocommerce_sessions', 'wptemp_clear_expired_woocommerce_sessions');Где разместить код
Добавьте этот код в файл functions.php вашей дочерней темы или в кастомный плагин.
Проверка результата после внедрения
- Подождите сутки или вызовите задачу вручную через WP-CLI:
wp cron event run wptemp_daily_clear_woocommerce_sessions - Проверьте логи ошибок сервера или файл
debug.log, если включен WP_DEBUG_LOG — там появится запись о том, сколько сессий удалено - Повторите SQL-запрос на подсчет сессий до и после запуска, чтобы убедиться в очистке
Частые ошибки и как их исправить
- Ошибка: WP-Cron не запускается автоматически
Причина: отсутствие трафика или отключён WP-Cron вwp-config.php. Решение: либо настроить системный Cron, либо запускать задачи вручную через WP-CLI. - Ошибка: ошибка при выполнении DELETE запроса
Причина: неправильное имя таблицы, префикс отличается отwp_. Решение: проверить значение$wpdb->prefixи подставить корректный префикс. - Удаляются не все старые сессии
Причина: некоторые сессии имеют дату истечения в будущем. Решение: это нормально, удаляем только просроченные записи.
Практические советы по производительности и безопасности
- Очищайте сессии регулярно — это поможет избежать избыточного роста таблицы и обеспечит стабильность сайта.
- Отключайте WP-Cron в высоконагруженных проектах и используйте системный Cron для надежного запуска задач.
- Логируйте удаление сессий для мониторинга и быстрого выявления проблем.
- Не удаляйте сессии вручную в рабочее время — планируйте задачи на время с минимальной нагрузкой.
Сравнение способов очистки сессий WooCommerce
| Способ | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагин для очистки сессий | Простой в использовании, интерфейс настройки | Дополнительная нагрузка, риск конфликтов | Использовать проверенные плагины, например WP-Optimize |
| Кастомный код с WP-Cron | Легкий, не требует сторонних плагинов, гибкий | Требует базовых знаний разработки, настройка Cron | Оптимальный вариант для разработчиков |
| Ручное удаление через SQL | Мгновенный эффект | Риск удаления нужных данных, требует доступа к БД | Использовать только для экстренных случаев |