Что такое пустые корзины в WooCommerce и зачем их удалять
В WooCommerce корзина хранится в таблице сессий в базе данных. Если пользователь начал добавлять товары, но не оформил заказ, корзина остается открытой. Такие «пустые» или заброшенные корзины занимают место в базе и могут влиять на производительность, особенно на больших магазинах. Удаление их автоматически помогает поддерживать базу данных в порядке без установки дополнительных плагинов.
Диагностика проблемы: как определить, что корзины не удаляются
Проверить наличие старых сессий можно напрямую через базу данных:
SELECT * FROM wp_woocommerce_sessions ORDER BY session_expiry DESC LIMIT 10;Если в таблице много записей с истекшим временем (session_expiry меньше текущего времени), значит устаревшие корзины не удаляются. Это может замедлять запросы и увеличивать размер БД.
Пошаговое решение: как автоматически удалять пустые корзины в WooCommerce
1. Добавляем кастомную функцию для очистки сессий
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wc_delete_expired_sessions() {
global $wpdb;
$table = $wpdb->prefix . 'woocommerce_sessions';
$now = time();
// Удаляем записи, у которых session_expiry меньше текущего времени
$deleted = $wpdb->query(
$wpdb->prepare(
"DELETE FROM $table WHERE session_expiry < %d",
$now
)
);
if ( defined('WP_DEBUG') && WP_DEBUG ) {
error_log("WooCommerce: удалено $deleted устаревших сессий.");
}
}2. Запускаем функцию через WP-Cron
Чтобы функция вызывалась регулярно, добавим крон-задачу:
function wc_schedule_sessions_cleanup() {
if ( ! wp_next_scheduled( 'wc_cleanup_expired_sessions' ) ) {
wp_schedule_event( time(), 'hourly', 'wc_cleanup_expired_sessions' );
}
}
add_action( 'wp', 'wc_schedule_sessions_cleanup' );
add_action( 'wc_cleanup_expired_sessions', 'wc_delete_expired_sessions' );Этот код создаст задачу, которая будет запускаться каждый час и удалять устаревшие сессии.
Проверка результата после внедрения
- Подождите час после добавления кода или запустите задачу вручную через WP-Cron (например, с помощью плагина WP Crontrol).
- Проверьте таблицу
wp_woocommerce_sessionsв базе данных — количество устаревших записей должно уменьшиться. - При включённом
WP_DEBUGсмотрите лог ошибок для записи об удалении сессий.
Частые ошибки и как их исправить
- Код не запускается по расписанию: Проверьте, что WP-Cron работает корректно, и на сайте есть трафик для его запуска. Для теста можно использовать плагин WP Crontrol.
- Удаляются не только пустые корзины, а все сессии: WooCommerce хранит сессии только для корзин, поэтому удаление по времени expiry — безопасно.
- Ошибка доступа к базе данных: Проверьте префикс таблицы
$wpdb->prefixи права пользователя БД.
Практические советы по безопасности и производительности
- Не запускайте очистку сессий чаще, чем раз в час, чтобы не нагружать базу.
- Резервное копирование базы данных перед внесением изменений — обязательный шаг.
- Если магазин большой, можно увеличить интервал запуска до нескольких часов или запускать вручную через WP-CLI.
Сравнение подходов удаления пустых корзин в WooCommerce
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Плагин (например, WP Rocket или специальные WooCommerce плагины) | Использование готовых решений для очистки и оптимизации базы | Простота установки, дополнительные функции | Зависимость от сторонних разработчиков, нагрузка |
| Кастомный код с WP-Cron | Реализация через свой код и штатный WP-Cron | Полный контроль, отсутствие лишних плагинов | Необходимость ручного контроля, возможные ошибки в коде |
| Ручная очистка SQL запросам | Разовые или регулярные ручные операции в базе данных | Точный контроль | Риск ошибок, требуется доступ к БД, неудобно |