Что такое забытые корзины в WooCommerce и почему их нужно удалять
Забытые корзины — это сессии пользователей, которые добавили товары, но не оформили заказ. Они занимают место в базе данных WooCommerce, замедляя работу сайта и влияя на производительность. Особенно актуально для магазинов с большим трафиком и большим количеством товаров.
Диагностика проблемы: как понять, что забытые корзины мешают
- Увеличение размера таблиц
wp_woocommerce_sessionsиwp_woocommerce_cart_hash - Замедленная загрузка страниц с товарами или в админке WooCommerce
- Большое число сессий с истекшим временем в базе данных
- Проверка через phpMyAdmin: запрос
SELECT COUNT(*) FROM wp_woocommerce_sessions WHERE session_expires < UNIX_TIMESTAMP()покажет количество просроченных сессий
Как автоматически удалять забытые корзины по CRON
1. Создаем кастомную функцию для удаления просроченных сессий
Добавьте следующий код в functions.php вашей дочерней темы или в собственный плагин:
function wpfactory_delete_expired_woocommerce_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 задачу для автоматизации
Добавьте в functions.php следующий код, который создаст ежедневный CRON-запуск:
if ( ! wp_next_scheduled( 'wpfactory_delete_expired_sessions_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wpfactory_delete_expired_sessions_hook' );
}
add_action( 'wpfactory_delete_expired_sessions_hook', 'wpfactory_delete_expired_woocommerce_sessions' );3. Опционально: добавляем хук для ручного запуска из админки
add_action('admin_post_wpfactory_manual_session_cleanup', function() {
if ( ! current_user_can('manage_woocommerce') ) {
wp_die('Нет доступа');
}
$deleted = wpfactory_delete_expired_woocommerce_sessions();
wp_redirect(admin_url('tools.php?deleted=' . $deleted));
exit;
});Теперь вы можете запустить очистку вручную, вызвав URL https://your-site.com/wp-admin/admin-post.php?action=wpfactory_manual_session_cleanup
Как проверить, что удаление работает
- Выполните запрос в базе:
SELECT COUNT(*) FROM wp_woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP()до и после запуска скрипта - Проверьте наличие CRON-задачи: в WP-CLI выполните
wp cron event list | grep wpfactory_delete_expired_sessions_hook - Запустите ручной удалитель и убедитесь, что число удаленных записей > 0
- Отслеживайте производительность сайта, особенно страницы с товарами и корзиной
Частые ошибки и как их исправить
- CRON не запускается автоматически: проверьте, что на сайте активен WP-Cron или настройте системный CRON на вызов
wp-cron.php - Неверное имя таблицы: убедитесь, что префикс таблиц совпадает с вашим, используйте
$wpdb->prefix - Удаление не происходит из-за прав доступа: убедитесь, что пользователь запускает скрипт с правами
manage_woocommerceили выше - Ошибки SQL: используйте
$wpdb->last_errorдля отладки после вызова запроса
Практические советы по безопасности и производительности
- Не запускайте очистку чаще, чем раз в день. Частые удаления могут нагрузить базу данных.
- Резервное копирование базы перед внедрением
- Оптимизируйте таблицы базы данных после удаления:
OPTIMIZE TABLE wp_woocommerce_sessions; - Используйте плагины кеширования и Clearfy Pro для дополнительной оптимизации и удаления лишних данных
- Для крупных магазинов с большим количеством сессий рассмотрите настройку системного CRON вместо WP-Cron
Сравнение подходов к удалению забытых корзин
| Метод | Плагин | Код | Плюсы | Минусы |
|---|---|---|---|---|
| Встроенный WP-Cron | Нет | Да (пример выше) | Легко настраивается, гибкость | Зависит от посещаемости сайта, может не запускаться вовремя |
| Системный CRON + WP-CLI | Нет | Да (wp cron event run) | Надежно, точное время выполнения | Требует доступа к серверу |
| Плагин очистки сессий | Да (например, WooCommerce Cart Cleanup) | Нет (использует настройки) | Простота настройки, интерфейс | Потенциальная нагрузка, зависит от качества плагина |