Почему важно удалять неактивные корзины в WooCommerce
В WooCommerce корзины (сессии покупок) хранятся в базе данных, даже если пользователь не завершил оформление заказа. Со временем таких неактивных корзин может накопиться много, что приводит к увеличению размера базы данных, замедлению запросов и потере производительности сайта. Автоматическое удаление устаревших корзин — простое, но эффективное решение для оптимизации магазина.
Диагностика проблемы с неактивными корзинами
Определите, есть ли проблема с неочищенными корзинами:
- Подключитесь к базе данных через phpMyAdmin или аналог.
- Выполните SQL-запрос для подсчёта текущих сессий корзин:
SELECT COUNT(*) FROM wp_woocommerce_sessions; - Обратите внимание на дату последнего обновления сессий:
SELECT session_id, session_expiry FROM wp_woocommerce_sessions ORDER BY session_expiry ASC LIMIT 10;
Если в таблице много записей со сроком действия давно истёкшим, это подтверждает проблему.
Как работает хранение корзин в WooCommerce
WooCommerce использует таблицу wp_woocommerce_sessions для хранения данных корзин пользователей (сессий). В ней есть поля:
session_id— идентификатор сессии;session_expiry— метка времени, когда сессия должна истечь;session_value— сериализованные данные корзины.
По умолчанию WooCommerce периодически очищает устаревшие сессии, однако на больших магазинах с высокой посещаемостью этой автоматизации может быть недостаточно.
Пошаговое решение: удаляем неактивные корзины по срокам через WP Cron
1. Создаём функцию удаления устаревших сессий
function wc_delete_expired_sessions() {
global $wpdb;
$table = $wpdb->prefix . 'woocommerce_sessions';
$current_time = time();
$deleted = $wpdb->query( $wpdb->prepare(
"DELETE FROM $table WHERE session_expiry < %d",
$current_time
));
return $deleted;
}2. Регистрируем WP Cron-задачу для периодической очистки
add_action('wc_delete_expired_sessions_hook', 'wc_delete_expired_sessions');
function wc_schedule_expired_sessions_cleanup() {
if (!wp_next_scheduled('wc_delete_expired_sessions_hook')) {
wp_schedule_event(time(), 'hourly', 'wc_delete_expired_sessions_hook');
}
}
add_action('wp', 'wc_schedule_expired_sessions_cleanup');3. Очистка при деактивации плагина/темы
function wc_clear_scheduled_expired_sessions_cleanup() {
$timestamp = wp_next_scheduled('wc_delete_expired_sessions_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wc_delete_expired_sessions_hook');
}
}
register_deactivation_hook(__FILE__, 'wc_clear_scheduled_expired_sessions_cleanup');Проверка результата после внедрения
Чтобы убедиться, что удаление работает:
- Подождите несколько часов после добавления кода.
- Снова выполните SQL-запрос для подсчёта сессий:
SELECT COUNT(*) FROM wp_woocommerce_sessions; - Количество устаревших сессий должно уменьшиться.
- Проверьте логи сервера (если есть) на наличие ошибок выполнения WP Cron.
Частые ошибки и как их исправить
- WP Cron не срабатывает: На некоторых хостингах WP Cron работает только при посещении сайта. Для гарантированной работы настройте системный cron на вызов
wp-cron.php. - Неправильный префикс таблиц: Убедитесь, что используете правильный префикс в
$wpdb->prefix, особенно если он был изменён в настройках WordPress. - Удаление не происходит: Проверьте права пользователя базы данных – он должен иметь права DELETE.
- Ошибки синтаксиса: Копируйте код внимательно, особенно кавычки и точки с запятой.
Практические советы по безопасности и производительности
- Выполняйте удаление неактивных корзин с интервалом не чаще одного раза в час, чтобы не перегружать базу.
- Добавьте логирование действий удаления, чтобы отслеживать сколько записей удаляется и когда.
- Перед массовым удалением сделайте резервную копию базы.
- Для больших магазинов можно расширить логику — удалять сессии старше, например, 30 дней, а более свежие оставлять.
Сравнение вариантов удаления неактивных корзин
| Метод | Плюсы | Минусы |
|---|---|---|
| WP Cron + SQL DELETE (код) | Гибкость, не требует плагинов, можно настроить сроки и логику | Зависит от работы WP Cron, требует навыков программирования |
| Плагины очистки базы | Простота использования, готовые функции очистки | Может быть избыточным, лишние зависимости, менее гибко |
| Ручная очистка через phpMyAdmin | Полный контроль, быстро | Риски ошибок, требует регулярного вмешательства |