Почему важно удалять старые корзины в WooCommerce
WooCommerce сохраняет данные о корзинах пользователей в сессиях. При большом трафике и длительном хранении этих данных база данных растет, что приводит к замедлению запросов и увеличению размера таблиц. Автоматическое удаление старых сессий помогает поддерживать производительность и оптимизировать использование ресурсов.
Диагностика проблемы с накоплением корзин
Для оценки, есть ли проблема с накоплением старых сессий, можно выполнить SQL-запрос к таблице сессий WooCommerce:
SELECT COUNT(*) as count, MIN(session_expiry) as oldest_session FROM wp_woocommerce_sessions;Если count очень большой и oldest_session — дата давно прошедшая, стоит очистить старые данные.
Где хранятся корзины WooCommerce
WooCommerce хранит сессии корзин в таблице wp_woocommerce_sessions. В этой таблице есть поля:
session_key— уникальный ключ сессии;session_value— сериализованные данные корзины;session_expiry— время истечения сессии (timestamp);
Пошаговое решение: удаление старых сессий через функцию
Добавим в файл functions.php вашей темы или в отдельный кастомный плагин следующий код, который удаляет сессии старше 7 дней:
function wptemp_delete_old_woocommerce_sessions() {
global $wpdb;
$threshold = time() - 7 * DAY_IN_SECONDS; // 7 дней назад
$table = $wpdb->prefix . 'woocommerce_sessions';
$deleted = $wpdb->query(
$wpdb->prepare(
"DELETE FROM $table WHERE session_expiry < %d",
$threshold
)
);
if (false === $deleted) {
error_log('Ошибка при удалении старых сессий WooCommerce');
} else {
error_log("Удалено старых сессий WooCommerce: $deleted");
}
}
// Запускаем очистку раз в сутки через WP-Cron
add_action('wptemp_daily_cleanup', 'wptemp_delete_old_woocommerce_sessions');
// Регистрируем событие при активации темы/плагина
function wptemp_schedule_daily_cleanup() {
if (!wp_next_scheduled('wptemp_daily_cleanup')) {
wp_schedule_event(time(), 'daily', 'wptemp_daily_cleanup');
}
}
add_action('wp', 'wptemp_schedule_daily_cleanup');Этот код создает ежедневное задание, которое удалит все сессии, у которых время истечения меньше текущего времени минус 7 дней.
Как проверить, что функция сработала
- Проверьте в базе данных количество записей в
wp_woocommerce_sessionsдо и после выполнения задания. - В файле
wp-content/debug.log(если включен WP_DEBUG_LOG) появится запись об удалении. - Можно вручную вызвать функцию через
wp shellили временно добавить вызовwptemp_delete_old_woocommerce_sessions();вfunctions.phpдля теста.
Частые ошибки и их решения
- Ошибка: функция не вызывается ежедневно
— Проверьте, что WP-Cron работает (например, посетите сайт). - Ошибка: нет прав на удаление
— Убедитесь, что база данных подключена корректно и пользователь MySQL имеет права на DELETE. - Ошибка в SQL-запросе
— Используйте$wpdb->prepareдля безопасности, как в примере.
Альтернативные способы и сравнение
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через SQL | Простота, моментальный эффект | Требуется доступ к базе, риск ошибочного удаления |
| Автоматизация через WP-Cron + код | Автоматически поддерживает чистоту, гибкая настройка | Зависит от работы WP-Cron, требует навыков кодинга |
| Плагины очистки сессий | Удобство, визуальный интерфейс | Дополнительные ресурсы, возможные конфликты |
Практические советы по безопасности и производительности
- Регулярно проверяйте размер таблицы
wp_woocommerce_sessions, особенно при большом трафике. - Не снижайте время хранения сессий слишком сильно, чтобы не ухудшить UX (корзина не должна пропадать слишком быстро).
- Для высокой нагрузки рассмотрите системный Cron вместо WP-Cron для надежности.
- Используйте
error_logили свой лог для мониторинга работы скрипта.