Что такое забытые корзины и почему их нужно удалять
В WooCommerce забытые корзины — это сессии пользователей, которые добавили товары, но не оформили заказ. Они занимают место в базе данных, замедляют работу сайта и искажают аналитику. Автоматическое удаление таких корзин помогает поддерживать базу данных в порядке и улучшать производительность.
Диагностика проблемы с забытыми корзинами в WooCommerce
Для начала нужно понять, сколько таких корзин сохраняется и как долго они хранятся. Для этого:
- Подключитесь к базе данных и выполните запрос к таблице
wp_woocommerce_sessions(префикс может отличаться). - Проверьте дату последнего обновления сессий (поле
session_expiry). - Если сессии хранятся более 48 часов и их много — пора очистить.
SELECT COUNT(*) AS count, AVG(session_expiry - UNIX_TIMESTAMP(NOW())) AS avg_expiry FROM wp_woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP(NOW());Если count больше 1000, а среднее время хранения превышает 2 суток — это негативно влияет на сайт.
Пошаговое решение: как автоматически удалять забытые корзины в WooCommerce
1. Настроить WP-Cron задачу для очистки сессий
WooCommerce хранит корзины в таблице wp_woocommerce_sessions. Удалять нужно сессии с истекшим сроком хранения.
2. Добавить кастомный обработчик очистки в functions.php
function wpfactory_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 ( defined('WP_DEBUG') && WP_DEBUG ) {
error_log('WooCommerce sessions cleared: ' . $deleted);
}
}
// Регистрируем крон-задачу
add_action('wpfactory_clear_expired_sessions_hook', 'wpfactory_clear_expired_woocommerce_sessions');
function wpfactory_schedule_session_cleanup() {
if ( ! wp_next_scheduled( 'wpfactory_clear_expired_sessions_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'wpfactory_clear_expired_sessions_hook' );
}
}
add_action('wp', 'wpfactory_schedule_session_cleanup');3. Проверка работы задачи
Через час после добавления кода проверьте в error_log (если включен WP_DEBUG), сколько записей удалено. Также:
- Посмотрите количество записей в
wp_woocommerce_sessionsдо и после. - Убедитесь, что сайт не начал выдавать ошибки при работе с корзиной.
Проверка результата после внедрения
Для проверки:
- Выполните SQL-запрос для подсчёта сессий с истекшим временем:
SELECT COUNT(*) FROM wp_woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP(NOW());Если результат 0 — задача успешно очистила забытые корзины.
Частые ошибки и как их исправить
- Ошибка: WP-Cron не запускается автоматически.
Решение: Убедитесь, что на сервере есть посещения сайта, либо настройте системный cron для wp-cron.php. - Ошибка: Код в functions.php вызывает фатальную ошибку.
Решение: Проверьте правильность синтаксиса и наличие глобальной переменной$wpdb. - Ошибка: Удаляются активные сессии.
Решение: Убедитесь, что условие удаления — только сессии сsession_expiryменьше текущего времени.
Практические советы по безопасности и производительности
- Удаление сессий происходит в отдельном запросе — не используйте этот код в хуках, которые вызываются при каждом запросе.
- Проверяйте cron задачи и логи ошибок раз в неделю.
- Для больших сайтов можно уменьшить частоту запуска до раз в сутки, чтобы избежать нагрузки.
- Если хотите расширить функционал — добавьте логирование и уведомления по email при ошибках.
Таблица сравнения способов удаления забытых корзин в WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин очистки сессий | Прост в установке, готовые настройки | Может замедлять сайт, лишние зависимости |
| Кастомный код с WP-Cron (как в статье) | Легкий, гибкий, без сторонних плагинов | Требует технических знаний и контроля cron |
| Ручное удаление через SQL | Мгновенно, полный контроль | Риск ошибок, неавтоматизировано |