Что такое нерабочие корзины в WooCommerce и зачем их удалять
В WooCommerce нерабочие (заброшенные) корзины — это сессии с добавленными товарами, но без оформления заказа. Они занимают место в базе данных, замедляют работу сайта и могут влиять на аналитику. Автоматическое удаление таких корзин по срокам помогает поддерживать базу в чистоте и ускорять обработку запросов.
Диагностика проблемы с нерабочими корзинами
Чтобы проверить, есть ли накопленные нерабочие корзины, смотрим таблицу wp_woocommerce_sessions (префикс может отличаться). В ней хранятся данные сессий пользователей, включая корзины. Часто записи сессий, не сопровождаемые заказами, остаются в базе долгое время.
Для диагностики выполните SQL-запрос (через phpMyAdmin или WP CLI):
SELECT session_key, session_value, session_expiry FROM wp_woocommerce_sessions ORDER BY session_expiry DESC LIMIT 10;Обратите внимание на session_expiry — это UNIX-метка времени, после которой сессия считается устаревшей.
Пошаговое решение: автоматическое удаление сессий с истекшим сроком
WooCommerce не удаляет устаревшие сессии автоматически. Для решения задачи добавим пользовательский код, который будет запускаться через 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
)
);
return $deleted;
}2. Регистрируем событие WP-Cron для ежечасного запуска
function wc_schedule_session_cleanup() {
if ( ! wp_next_scheduled( 'wc_cleanup_expired_sessions_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'wc_cleanup_expired_sessions_hook' );
}
}
add_action( 'wp', 'wc_schedule_session_cleanup' );
add_action( 'wc_cleanup_expired_sessions_hook', 'wc_delete_expired_sessions' );3. Опционально: логируем удаление для отладки
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 ( defined('WP_DEBUG') && WP_DEBUG ) {
error_log("WooCommerce: deleted $deleted expired sessions");
}
return $deleted;
}Проверка результата после внедрения
- Подключитесь к базе данных и выполните тот же SQL-запрос из блока диагностики. Количество записей с устаревшим
session_expiryдолжно уменьшиться после запуска cron. - Для ручного теста вызовите функцию через wp-cli:
wp eval 'echo wc_delete_expired_sessions();'— должен вернуть число удаленных записей. - Проверьте логи ошибок PHP (если включено логирование) на сообщения об удалении сессий.
Частые ошибки и как их исправить
- Крон-событие не запускается: Убедитесь, что на сайте есть трафик (WP-Cron запускается при посещениях). Для теста используйте реальные системные cron или WP-CLI.
- Неверный префикс таблиц: Префикс может отличаться от
wp_. Используйте$wpdb->prefixдля получения правильного префикса. - Удаление не работает: Проверьте права пользователя базы данных на DELETE-запросы.
- Код добавлен в неподходящее место: Поместите код в файл
functions.phpдочерней темы или в собственный плагин, а не в ядро WooCommerce.
Практические советы по безопасности и производительности
- Не выполняйте чистку слишком часто — достаточно запуска раз в час или раз в сутки, чтобы не нагружать базу.
- Следите за размером таблицы
wp_woocommerce_sessions, при большом объеме рассмотрите оптимизацию базы или использование внешних кэшей. - Для сайтов с большим трафиком можно использовать системный cron вместо WP-Cron, чтобы гарантировать регулярность запуска.
- Перед внесением изменений сделайте резервную копию базы данных.
Сравнение вариантов автоматического удаления сессий
| Метод | Преимущества | Недостатки | Пример |
|---|---|---|---|
| WP-Cron с пользовательским кодом | Легко реализовать, не требует внешних настроек | Зависит от посещаемости сайта, возможны задержки | Код из статьи |
| Системный cron + WP-CLI | Гарантированное выполнение по расписанию | Требует доступа к серверу и настройки cron | 0 * * * * wp eval 'wc_delete_expired_sessions();' |
| Плагины очистки сессий | Готовое решение с настройками | Дополнительный плагин, может быть избыточным | Пример: WP Rocket (частично) |