Что такое заброшенные корзины в WooCommerce и почему их нужно удалять
Заброшенные корзины — это сессии, в которых пользователи добавили товары, но не оформили заказ. Их накопление ведет к излишнему росту таблиц базы данных, снижению производительности и затрудняет аналитику. WooCommerce по умолчанию не удаляет такие корзины автоматически, поэтому нужно реализовать собственное решение.
Диагностика проблемы: как определить наличие заброшенных корзин
Корзины в WooCommerce хранятся в таблице wp_woocommerce_sessions (префикс может отличаться). В ней сохраняются сессии пользователей, в том числе и незавершённые корзины.
Чтобы проверить наличие старых заброшенных корзин, выполните в базе данных MySQL следующий запрос (подставьте ваш префикс таблиц):
SELECT session_key, session_value, session_expiry FROM wp_woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP() - 86400;Этот запрос покажет корзины сессий, которые истекли более суток назад. Если таких много, стоит настроить их очистку.
Пошаговое решение: автоматическое удаление заброшенных корзин через 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
)
);
if ( false === $deleted ) {
error_log('Ошибка при удалении просроченных сессий WooCommerce');
}
}2. Регистрируем периодическое задание WP-Cron
Добавьте в файл functions.php вашей темы или в собственный плагин следующий код:
if ( ! wp_next_scheduled( 'wc_delete_expired_sessions_event' ) ) {
wp_schedule_event( time(), 'hourly', 'wc_delete_expired_sessions_event' );
}
add_action( 'wc_delete_expired_sessions_event', 'wc_delete_expired_sessions' );Здесь мы запускаем функцию очистки каждый час. Интервал можно менять, если требуется чаще или реже.
Как проверить, что удаление сработало
- Выполните SQL-запрос из раздела диагностики до и после внедрения кода — количество просроченных сессий должно уменьшиться или равняться нулю.
- Проверьте логи ошибок на наличие сообщений из
error_logв случае проблем. - Проверьте таблицу
wp_woocommerce_sessionsв базе через phpMyAdmin или консоль — записи сsession_expiryменьше текущего времени должны отсутствовать.
Частые ошибки и как их исправить
- Cron-задача не запускается: Проверьте, что на сайте посещают страницы — WordPress запускает WP-Cron при загрузке страниц. Для 100% гарантии используйте системный cron или плагин WP Crontrol.
- Неправильный префикс таблиц: Убедитесь, что используете правильный префикс в запросах, он совпадает с
$wpdb->prefix. - Ошибка в SQL-запросе: Используйте
$wpdb->prepareдля безопасности и правильного формирования запроса. - Функция не добавлена в тему или плагин: Проверьте, что код находится в активном файле, а не в отключенной теме или неактивном плагине.
Практические советы по безопасности и производительности
- Удаляйте сессии с осторожностью — не удаляйте активные (с
session_expiryв будущем), чтобы не прервать текущие заказы. - Для высокой нагрузки используйте системный cron вместо WP-Cron, чтобы гарантировать регулярное выполнение.
- Логируйте ошибки удаления сессий для своевременного обнаружения проблем.
- Если на сайте большое количество сессий, разбивайте удаление на порции, чтобы не перегружать базу:
function wc_delete_expired_sessions_batch() {
global $wpdb;
$table = $wpdb->prefix . 'woocommerce_sessions';
$current_time = time();
$batch_size = 1000;
$expired_sessions = $wpdb->get_col(
$wpdb->prepare(
"SELECT session_key FROM $table WHERE session_expiry < %d LIMIT %d",
$current_time, $batch_size
)
);
if ( ! empty( $expired_sessions ) ) {
foreach ( $expired_sessions as $session_key ) {
$wpdb->delete( $table, array( 'session_key' => $session_key ) );
}
}
}Сравнение способов удаления заброшенных корзин
| Метод | Преимущества | Недостатки |
|---|---|---|
| Использование WP-Cron и собственного кода | Полный контроль, без плагинов, легко адаптируется | Зависит от посещаемости сайта, требует базовых знаний SQL |
| Плагины (например, WP Optimize, Clearfy Pro) | Простота настройки, дополнительные функции оптимизации | Нагрузка на сайт, лишний код, возможные конфликты |
| Ручное удаление через базу данных | Мгновенный эффект, без нагрузки на сайт | Риски удаления нужных данных, требует доступа к БД |