Диагностика проблемы с заброшенными корзинами в WooCommerce
Заброшенные корзины в WooCommerce накапливаются, если пользователи добавляют товары, но не завершают покупку. Это не только создает шум в базе данных, но и может замедлять производительность сайта и влиять на аналитику. WooCommerce по умолчанию не удаляет такие корзины, поэтому задача автоматического удаления старых заброшенных корзин становится актуальной.
Проверить наличие заброшенных корзин можно, изучив таблицу wp_woocommerce_sessions (префикс wp_ может отличаться в зависимости от настройки базы данных). В ней хранятся сессии пользователей, включая данные корзины. Если там много записей с длительным временем неактивности, это признак накопления заброшенных корзин.
Как проверить количество сессий в базе данных
SELECT COUNT(*) FROM wp_woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP(NOW());Этот запрос покажет количество просроченных сессий, которые можно безопасно удалить.
Пошаговое решение: автоматическое удаление заброшенных корзин через WP-Cron
1. Создаем функцию очистки сессий
Для удаления просроченных сессий WooCommerce можно использовать следующий код. Он удаляет записи из таблицы сессий, срок действия которых истек.
function wpskill_clear_expired_woocommerce_sessions() {
global $wpdb;
$table = $wpdb->prefix . 'woocommerce_sessions';
$time_now = time();
$deleted = $wpdb->query( $wpdb->prepare(
"DELETE FROM $table WHERE session_expiry < %d",
$time_now
));
if ( false !== $deleted ) {
error_log("[WP-Cron] Удалено заброшенных корзин: " . $deleted);
}
}2. Регистрируем событие WP-Cron
Добавим планировщик задач, который будет запускать нашу функцию ежедневно.
function wpskill_schedule_clear_sessions() {
if ( ! wp_next_scheduled( 'wpskill_daily_clear_sessions' ) ) {
wp_schedule_event( time(), 'daily', 'wpskill_daily_clear_sessions' );
}
}
add_action( 'wp', 'wpskill_schedule_clear_sessions' );
add_action( 'wpskill_daily_clear_sessions', 'wpskill_clear_expired_woocommerce_sessions' );3. Очистка при деактивации плагина или темы
Если код размещается в плагине или теме, важно убрать планировщик при их деактивации:
function wpskill_clear_sessions_deactivation() {
$timestamp = wp_next_scheduled( 'wpskill_daily_clear_sessions' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpskill_daily_clear_sessions' );
}
}Проверка результата после внедрения
- Посмотрите логи ошибок PHP (error_log), чтобы убедиться, что в них появилась запись с количеством удаленных сессий.
- Повторно выполните SQL-запрос из раздела диагностики, чтобы проверить уменьшение количества просроченных сессий.
- Проверьте, что сайт работает стабильно, а корзина WooCommerce корректно сохраняет активные сессии.
Частые ошибки при реализации автоматического удаления заброшенных корзин
- Неправильный префикс таблиц в SQL-запросах. Используйте
$wpdb->prefix, чтобы избежать ошибок. - Отсутствие регистрации WP-Cron события. Без
wp_schedule_eventфункция не запустится. - Дублирование событий. Проверяйте наличие запланированного события через
wp_next_scheduled, чтобы не создавать несколько одинаковых задач. - Запуск крона только при посещении сайта. WP-Cron зависит от трафика. Для сайтов с низкой посещаемостью стоит настроить системный cron.
Практические советы по производительности и безопасности
- Оптимизируйте частоту запуска. Если сайт большой, запускать очистку лучше не чаще раза в сутки, чтобы не нагружать базу.
- Логируйте действия. Ведение логов помогает отслеживать эффективность и выявлять проблемы.
- Обеспечьте безопасность кода. Код не должен допускать SQL-инъекции — используйте методы
$wpdb->prepare. - При низком трафике используйте системный cron. Например, добавьте в crontab вызов WP-Cron скрипта:
* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Сравнение способов очистки заброшенных корзин
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| WP-Cron (код) | Автоматическое удаление сессий через планировщик WordPress | Гибко, без плагинов, контроль кода | Зависит от трафика, требует навыков кодирования |
| Плагины очистки | Готовые решения для удаления старых сессий и оптимизации | Простота установки, интерфейс | Может грузить сайт, ограниченная настройка |
| Ручное удаление SQL | Запуск SQL команд вручную | Точный контроль, быстро | Риск ошибок, требует доступа к базе |