Диагностика проблемы: почему накапливаются забытые корзины
В WooCommerce при добавлении товаров в корзину данные сохраняются в сессии пользователя и базе данных (таблица wp_woocommerce_sessions). Если покупатель не завершил заказ, корзина остается "забытой". При большом количестве таких корзин база растет, что может замедлять работу сайта и усложнять анализ актуальных заказов.
Признаки проблемы:
- Значительный рост размера таблицы
wp_woocommerce_sessionsв базе данных. - Задержка при оформлении заказа или загрузке страниц с корзиной.
- Старые сессии пользователей, которые уже не актуальны.
Пошаговое решение: автоматическое удаление забытых корзин
1. Создаем кастомную функцию для очистки устаревших сессий
WooCommerce хранит данные сессий в базе и по умолчанию не удаляет их немедленно. Мы можем использовать WP Cron для регулярного удаления сессий старше определенного времени.
function wc_clear_expired_cart_sessions() {
global $wpdb;
$session_lifetime = 2 * DAY_IN_SECONDS; // время жизни сессии 2 дня
$time_limit = time() - $session_lifetime;
// Таблица сессий WooCommerce
$table = $wpdb->prefix . 'woocommerce_sessions';
// Удаляем сессии с meta_value (сериализованные данные) с timestamp ниже заданного
$deleted = $wpdb->query( $wpdb->prepare(
"DELETE FROM $table WHERE session_expiry < %d",
$time_limit
));
return $deleted;
}2. Добавляем WP Cron задачу для автоматизации
Добавим расписание, которое будет запускать очистку раз в день.
// Регистрируем событие при активации темы или плагина
function wc_schedule_cart_cleanup() {
if ( ! wp_next_scheduled( 'wc_daily_cart_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wc_daily_cart_cleanup' );
}
}
add_action( 'wp', 'wc_schedule_cart_cleanup' );
// Запускаем функцию очистки по крону
add_action( 'wc_daily_cart_cleanup', 'wc_clear_expired_cart_sessions' );
// Отключаем крон при деактивации
function wc_unschedule_cart_cleanup() {
$timestamp = wp_next_scheduled( 'wc_daily_cart_cleanup' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wc_daily_cart_cleanup' );
}
}3. Тестовый запуск функции вручную
Для проверки можно вызвать функцию из консоли или добавить временный вызов в functions.php:
add_action('init', function() {
if ( current_user_can('administrator') && isset($_GET['clear_cart_sessions']) ) {
$deleted = wc_clear_expired_cart_sessions();
echo "Удалено старых сессий: " . intval($deleted);
exit;
}
});После запуска перейдите по URL https://your-site.com/?clear_cart_sessions=1 (только под админом) и убедитесь, что функция выполнена.
Проверка результата после внедрения
- Мониторьте размер таблицы
wp_woocommerce_sessionsчерез phpMyAdmin или консоль базы данных. - Проверяйте логи WP Cron (плагины типа WP Crontrol помогут увидеть расписание).
- Убедитесь, что старая корзина не отображается у пользователей спустя 2 дня.
Частые ошибки и как их исправить
- Функция не удаляет сессии: проверьте имя таблицы и наличие поля
session_expiry. В некоторых версиях WooCommerce поле может называться иначе или использоваться другая логика хранения сессий. - WP Cron не запускается: на некоторых хостингах WP Cron требует внешних вызовов (wp-cron.php). Используйте системный cron или плагин WP Crontrol для отладки.
- Удалены активные корзины: уменьшите значение
$session_lifetime, чтобы не удалять сессии слишком рано.
Практические советы по производительности и безопасности
- Регулярно очищайте не только сессии, но и транзиенты WooCommerce для уменьшения нагрузки.
- Используйте плагин Clearfy Pro для автоматизации очистки и оптимизации базы без риска удаления нужных данных (https://wpshop.ru/plugins/clearfy).
- Ограничьте доступ к отладочным URL с очищением сессий только администраторам для безопасности.
Сравнение вариантов автоматической очистки корзин
| Метод | Плюсы | Минусы | Пример кода/Плагин |
|---|---|---|---|
| Ручной SQL-запрос | Простота, быстрый эффект | Риск ошибки, требует доступа к БД | DELETE FROM wp_woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP(); |
| WP Cron + кастомная функция | Автоматизация, гибкость | Зависит от работы WP Cron, требует поддержки кода | Код из статьи |
| Плагин Clearfy Pro | Готовое решение, безопасность, поддержка | Платный, дополнительный вес плагина | Clearfy Pro |