Что такое забытые корзины в WooCommerce и почему их нужно удалять
Забытые корзины — это товары, добавленные пользователем в корзину, но не завершённые заказом. Они занимают ресурсы базы данных и могут влиять на производительность сайта, особенно при большом трафике. Регулярное удаление таких корзин помогает оптимизировать работу WooCommerce и избежать накопления устаревших данных.
Диагностика проблемы: как определить наличие забытых корзин
В WooCommerce корзина хранится в сессиях пользователей и в таблице wp_woocommerce_sessions. Чтобы проверить, сколько сессий сейчас активно и сколько из них содержат корзину, используйте следующий SQL-запрос (через phpMyAdmin или WP CLI):
SELECT COUNT(*) AS total_sessions FROM wp_woocommerce_sessions;Чтобы узнать, сколько сессий старше, например, 7 дней, выполните:
SELECT COUNT(*) AS old_sessions FROM wp_woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 7 DAY));Если количество устаревших сессий большое — пора настроить автоматическое удаление.
Пошаговое решение: удаление забытых корзин через WP Cron
1. Создаём функцию для очистки старых сессий
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wpfactory_clear_old_woocommerce_sessions() {
global $wpdb;
$seven_days_ago = time() - 7 * DAY_IN_SECONDS;
$table = $wpdb->prefix . 'woocommerce_sessions';
// Удаляем сессии, у которых время истекло более 7 дней назад
$deleted = $wpdb->query(
$wpdb->prepare(
"DELETE FROM $table WHERE session_expiry < %d",
$seven_days_ago
)
);
return $deleted;
}2. Регистрируем событие WP Cron для запуска очистки раз в сутки
// Добавляем событие при активации темы или плагина
function wpfactory_schedule_clear_sessions() {
if (!wp_next_scheduled('wpfactory_daily_clear_sessions')) {
wp_schedule_event(time(), 'daily', 'wpfactory_daily_clear_sessions');
}
}
add_action('wp', 'wpfactory_schedule_clear_sessions');
// Запускаем функцию при срабатывании крон задачи
add_action('wpfactory_daily_clear_sessions', 'wpfactory_clear_old_woocommerce_sessions');3. Удаляем крон задачу при деактивации (если в плагине)
function wpfactory_unschedule_clear_sessions() {
$timestamp = wp_next_scheduled('wpfactory_daily_clear_sessions');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpfactory_daily_clear_sessions');
}
}Проверка результата после внедрения
1. Вручную запустите функцию очистки для проверки (например, через WP-CLI):
wp eval 'echo wpfactory_clear_old_woocommerce_sessions();'Вывод — количество удалённых записей. Если число больше нуля, очистка работает.
2. Через phpMyAdmin проверьте таблицу wp_woocommerce_sessions: количество записей должно уменьшиться после запуска.
3. Убедитесь, что больше нет накопления сессий старше 7 дней, повторив SQL-запросы из раздела диагностики.
Частые ошибки и как их исправить
- Неверное имя таблицы: в мультисайтовой установке префикс таблиц может отличаться; используйте
$wpdb->prefixдля универсальности. - Функция не запускается автоматически: WP Cron запускается при посещении сайта. Для сайтов с низким трафиком настройте системный cron на вызов wp-cron.php.
- Удаляются нужные сессии: проверьте, что условие
session_expiry < $seven_days_agoкорректно, чтобы не удалять актуальные корзины. - Проблемы с правами базы данных: убедитесь, что пользователь БД имеет права DELETE для таблицы
wp_woocommerce_sessions.
Практические советы по безопасности и производительности
- Удаление сессий напрямую из базы — эффективный способ, но выполняйте бэкап базы перед внедрением.
- Используйте WP Cron для регулярного запуска, но на высоконагруженных сайтах лучше настроить системный cron для стабильности.
- Не уменьшайте интервал очистки меньше 1 дня, чтобы не ухудшить пользовательский опыт.
- Чтобы убедиться в безопасности, не удаляйте другие таблицы WooCommerce и не трогайте таблицы с заказами и пользователями.
Таблица сравнения методов удаления забытых корзин
| Метод | Преимущества | Недостатки | Пример использования |
|---|---|---|---|
| WP Cron + SQL DELETE | Полный контроль, не требует плагинов, гибкость настройки интервала | Зависимость от посещаемости сайта, требует навыков SQL | Код из статьи |
| Плагины очистки сессий | Удобство настройки, визуальный интерфейс | Может быть избыточным, нагрузка на сайт, сторонний код | WooCommerce Session Cleaner |
| Ручное удаление через phpMyAdmin | Простота при единичных очистках | Риск ошибок, не автоматизировано | SQL-запросы из раздела диагностики |