Диагностика проблемы с брошенными корзинами в WooCommerce
В WooCommerce часто возникает ситуация, когда пользователи добавляют товары в корзину, но не завершают покупку. Это приводит к "зависшим" корзинам, которые могут создавать нагрузку на базу данных и исказить аналитику. Важно вовремя очищать такие корзины и при этом иметь возможность отслеживать брошенные заказы для дальнейшей работы с клиентом.
Как определить, что корзина нуждается в очистке?
- Корзина не обновлялась длительное время (обычно более 24 часов).
- Нет активности пользователя, например, отсутствие заказов с этим же пользовательским ID или сессией.
- Рост записей в таблице
wp_woocommerce_sessions.
Проверить количество сессий можно запросом в базе данных:
SELECT COUNT(*) FROM wp_woocommerce_sessions;Если число сессий растет постоянно без снижения — значит, очистка не происходит.
Пошаговое решение: автоматическая очистка корзин и уведомления о брошенных заказах
1. Очистка старых сессий WooCommerce
WooCommerce хранит данные корзин в таблице wp_woocommerce_sessions. По умолчанию сессии очищаются через 48 часов, но этот интервал можно настроить и дополнительно удалить старые сессии через WP-Cron.
Добавьте следующий код в functions.php вашей темы или в отдельный плагин:
function wc_cleanup_old_sessions() {
global $wpdb;
$expiration = 48 * HOUR_IN_SECONDS; // 48 часов
$time = time() - $expiration;
$sessions_table = $wpdb->prefix . 'woocommerce_sessions';
// Удаляем сессии, которые не обновлялись более 48 часов
$deleted = $wpdb->query(
$wpdb->prepare(
"DELETE FROM $sessions_table WHERE session_expiry < %d",
$time
)
);
}
// Регистрируем WP-Cron для очистки раз в 12 часов
if ( ! wp_next_scheduled( 'wc_cleanup_sessions_event' ) ) {
wp_schedule_event( time(), 'twicedaily', 'wc_cleanup_sessions_event' );
}
add_action( 'wc_cleanup_sessions_event', 'wc_cleanup_old_sessions' );2. Отслеживание брошенных заказов с помощью хука
Для сбора данных о брошенных корзинах можно использовать хук woocommerce_cart_emptied или отслеживать статус заказов, которые не были завершены.
Пример логирования брошенных корзин для последующего анализа:
add_action( 'woocommerce_cart_emptied', 'log_abandoned_cart' );
function log_abandoned_cart() {
if ( ! is_user_logged_in() ) {
return; // Логируем только для авторизованных пользователей
}
$user_id = get_current_user_id();
$cart = WC()->cart->get_cart();
$cart_items = [];
foreach ( $cart as $item ) {
$cart_items[] = [
'product_id' => $item['product_id'],
'quantity' => $item['quantity'],
];
}
if ( empty( $cart_items ) ) {
return;
}
// Записываем в пользовательский мета ключ
update_user_meta( $user_id, '_last_abandoned_cart', $cart_items );
}3. Отправка напоминаний пользователям о брошенных корзинах
Для отправки email-напоминаний используйте WP-Cron и функцию wp_mail(). Пример запуска задачи раз в день:
function send_abandoned_cart_reminders() {
$users = get_users();
foreach ( $users as $user ) {
$cart_items = get_user_meta( $user->ID, '_last_abandoned_cart', true );
if ( empty( $cart_items ) ) {
continue;
}
$message = "Здравствуйте, вы оставили товары в корзине:\n";
foreach ( $cart_items as $item ) {
$product = wc_get_product( $item['product_id'] );
if ( $product ) {
$message .= $product->get_name() . ' - Количество: ' . $item['quantity'] . "\n";
}
}
$message .= "\nПерейдите к оформлению заказа: " . wc_get_cart_url();
wp_mail( $user->user_email, 'Напоминание о брошенной корзине', $message );
// Очистка мета после отправки
delete_user_meta( $user->ID, '_last_abandoned_cart' );
}
}
if ( ! wp_next_scheduled( 'send_abandoned_cart_reminders_event' ) ) {
wp_schedule_event( time(), 'daily', 'send_abandoned_cart_reminders_event' );
}
add_action( 'send_abandoned_cart_reminders_event', 'send_abandoned_cart_reminders' );Проверка результата после внедрения
- Проверьте таблицу
wp_woocommerce_sessionsдо и после запуска очистки — количество записей должно уменьшиться. - Симулируйте добавление товара в корзину и выход без оформления — через сутки проверьте, отправилось ли письмо-напоминание.
- Проверьте логи пользователей с мета ключом
_last_abandoned_cartчерез phpMyAdmin или кодомget_user_meta().
Частые ошибки и как их исправить
- Сессии не удаляются: Проверьте, что WP-Cron работает корректно (например, с помощью плагина WP Crontrol). Если сайт без посещений, WP-Cron может не запускаться — настройте серверный cron.
- Письма не отправляются: Убедитесь, что
wp_mail()правильно настроена, нет блокировок SMTP, и письма не попадают в спам. Рекомендуется использовать SMTP-плагины. - Накладная нагрузка при большом числе пользователей: Делайте рассылку партиями, например, по 50 пользователей за запуск WP-Cron.
Практические советы по безопасности и производительности
- Не храните лишние данные в пользовательских метах. После отправки напоминания очищайте метаданные.
- Для очистки сессий используйте подготовленные запросы и минимизируйте время выполнения.
- Для крупных сайтов лучше настроить системный cron вместо WP-Cron, чтобы избежать сбоев при низкой посещаемости.
- Рассмотрите использование специализированных плагинов для брошенных корзин, если нужен расширенный функционал (например, Abandoned Cart Lite for WooCommerce), но не забывайте про нагрузку и безопасность.
Сравнение вариантов очистки корзин и работы с брошенными заказами
| Метод | Плюсы | Минусы | Код / Плагин |
|---|---|---|---|
| Ручная очистка через WP-Cron | Легко контролировать, кастомизация под нужды | Требует настройки cron, возможны сбои | Код из статьи |
| Отслеживание через пользовательские мета | Позволяет собирать данные для email-рассылок | Нужно аккуратно очищать метаданные | Код из статьи |
| Плагины для брошенных корзин | Готовый функционал, шаблоны писем, аналитика | Могут нагружать сайт, требуют обновлений | Abandoned Cart Lite, WooCommerce Cart Abandonment Recovery |