Что такое заброшенные корзины в WooCommerce и почему их нужно удалять
Заброшенные корзины — это товары, добавленные в корзину пользователями, но не доведённые до оформления заказа. Они занимают место в базе данных, создают нагрузку и могут влиять на аналитику. В крупных магазинах их количество может достигать тысяч, что замедляет работу сайта и увеличивает размер базы.
Диагностика проблемы: как определить наличие и количество заброшенных корзин
В WooCommerce корзины хранятся как сессии пользователей в таблице wp_woocommerce_sessions. Чтобы оценить количество заброшенных корзин, можно выполнить SQL-запрос:
SELECT COUNT(*) FROM wp_woocommerce_sessions;Важно понимать, что сессии автоматически не удаляются, а срок их жизни по умолчанию — 48 часов. Если сайт активно растёт, количество сессий может быстро увеличиваться.
Также посмотрите дату последнего обновления сессий, чтобы убедиться, что они действительно устарели:
SELECT session_key, session_value, session_expiry FROM wp_woocommerce_sessions ORDER BY session_expiry ASC LIMIT 10;Пошаговое решение: реализация автоматического удаления старых сессий WooCommerce через WP-Cron
1. Создание функции удаления устаревших корзин
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
function wpcontent_delete_expired_woocommerce_sessions() {
global $wpdb;
$table = $wpdb->prefix . 'woocommerce_sessions';
$time_now = current_time('timestamp');
$deleted = $wpdb->query(
$wpdb->prepare(
"DELETE FROM {$table} WHERE session_expiry < %d",
$time_now
)
);
if ( false === $deleted ) {
error_log('Ошибка при удалении устаревших сессий WooCommerce');
} else {
error_log("Удалено {$deleted} устаревших сессий WooCommerce");
}
}2. Регистрация WP-Cron задачи
Добавьте эту функцию для регистрации задачи, которая будет запускаться ежедневно:
add_action('wpcontent_delete_expired_sessions_hook', 'wpcontent_delete_expired_woocommerce_sessions');
function wpcontent_schedule_expired_sessions_cleanup() {
if (!wp_next_scheduled('wpcontent_delete_expired_sessions_hook')) {
wp_schedule_event(time(), 'daily', 'wpcontent_delete_expired_sessions_hook');
}
}
add_action('wp', 'wpcontent_schedule_expired_sessions_cleanup');3. Отмена задачи при деактивации темы или плагина
Чтобы не оставлять лишние запланированные задания, добавьте удаление Cron при деактивации:
function wpcontent_clear_expired_sessions_cron() {
$timestamp = wp_next_scheduled('wpcontent_delete_expired_sessions_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpcontent_delete_expired_sessions_hook');
}
}
register_deactivation_hook(__FILE__, 'wpcontent_clear_expired_sessions_cron');Проверка результата после внедрения
- Проверьте логи ошибок PHP (error_log) — в них должны появляться сообщения о количестве удалённых сессий.
- Выполните SQL-запрос для проверки уменьшения количества записей в
wp_woocommerce_sessions. - Через несколько дней убедитесь, что база не растёт за счёт старых сессий.
Частые ошибки и способы их исправления
- Неправильный префикс таблицы: Замените
$wpdb->prefixна ваш префикс, если он отличается отwp_. - Не запускается WP-Cron: Если на сайте мало трафика, WP-Cron может не срабатывать. Настройте системный
cronили используйте плагин для запуска cron. - Удаление активных сессий: Убедитесь, что функция удаляет только сессии с истёкшим временем (
session_expiry < current_time). - Ошибки доступа к базе: Проверьте права пользователя MySQL и корректность подключения к базе в
wp-config.php.
Практические советы по безопасности и производительности
- Регулярные бэкапы: Перед внедрением любых автоматических чисток сделайте резервную копию базы данных.
- Логирование: Используйте
error_logили другой механизм для отслеживания очистки, чтобы вовремя заметить проблемы. - Оптимизация запросов: Запрос на удаление ограничен по времени с помощью
session_expiry, что быстро выполняется на индексированных полях. - Настройка WP-Cron: Для крупных сайтов лучше отключить имитацию WP-Cron и настроить системный cron для надёжности.
Сравнение способов очистки заброшенных корзин
| Метод | Плагин | Код на PHP | Компромисс |
|---|---|---|---|
| Удаление сессий | WooCommerce Session Cleaner (редко) | WP-Cron + SQL DELETE | Плагины создают нагрузку, код требует поддержки |
| Автоматическое удаление заброшенных корзин | Плагины с расширенной логикой | Простое удаление устаревших сессий | Плагины удобнее, но тяжелее для сайта |
| Ручная очистка | Нет | SQL-запросы в phpMyAdmin | Риск ошибок, требует навыков |