Почему важно удалять неактивные корзины и заказы в WooCommerce
Неактивные корзины и заказы создают нагрузку на базу данных и могут искажать аналитику продаж. Особенно на крупных магазинах, где тысячи пользователей добавляют товары, но не завершают покупку. Автоматическое удаление таких данных помогает поддерживать производительность и чистоту данных.
Диагностика проблемы с неактивными корзинами и заказами
Чтобы понять, насколько актуальна проблема, выполните запрос к базе данных для подсчёта заказов со статусом pending или failed старше 30 дней:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);Для корзин (сессий) можно проверить таблицу wp_woocommerce_sessions, если она есть:
SELECT COUNT(*) FROM wp_woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP() - 3600*24*30;Если результаты показывают большое число записей, необходимо настроить их автоматическое удаление.
Пошаговое решение: автоматическое удаление неактивных заказов
1. Создаём функцию для удаления заказов по статусам и возрасту
function wc_delete_old_orders() {
$days = 30; // Период хранения заказов в днях
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-pending', 'wc-failed'),
'date_query' => array(
array(
'before' => date('Y-m-d', strtotime("-{$days} days")),
),
),
'fields' => 'ids',
'posts_per_page' => -1,
);
$orders = get_posts($args);
if (empty($orders)) {
return;
}
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Без возможности восстановления
}
}2. Автоматизация через WP-Cron
Добавим задачу, которая будет запускать функцию ежесуточно.
function wc_schedule_old_order_cleanup() {
if (!wp_next_scheduled('wc_delete_old_orders_event')) {
wp_schedule_event(time(), 'daily', 'wc_delete_old_orders_event');
}
}
add_action('wp', 'wc_schedule_old_order_cleanup');
add_action('wc_delete_old_orders_event', 'wc_delete_old_orders');3. Очистка неактивных сессий (корзин)
WooCommerce хранит сессии в опциях или в кастомной таблице. Для стандартной таблицы wp_woocommerce_sessions можно использовать такой код:
function wc_delete_old_sessions() {
global $wpdb;
$days = 30;
$expiry_limit = time() - ($days * DAY_IN_SECONDS);
$table = $wpdb->prefix . 'woocommerce_sessions';
$wpdb->query($wpdb->prepare(
"DELETE FROM $table WHERE session_expiry < %d",
$expiry_limit
));
}
add_action('wc_delete_old_orders_event', 'wc_delete_old_sessions');Проверка результата после внедрения
- Выполните запросы из блока диагностики через 2-3 дня после активации.
- Убедитесь, что количество заказов со статусом
pendingиfailedснизилось. - Проверьте таблицу сессий на уменьшение записей.
- Проверьте логи сервера на ошибки, связанные с wp_cron.
Частые ошибки и как исправить
- Не срабатывает wp_cron: проверьте, что на сайте посещается хотя бы одна страница в сутки или настройте системный cron.
- Удаление не происходит: убедитесь, что функция
wp_delete_postвызывается с параметромtrueдля безвозвратного удаления. - Ошибки при доступе к таблице
wp_woocommerce_sessions: проверьте, что таблица существует и используется WooCommerce версией, установленной на сайте. - Удаляются нужные заказы: уточните фильтр статусов в запросах, добавьте логи в функцию для контроля.
Практические советы по безопасности и производительности
- Перед внедрением на продакшн тестируйте на копии сайта.
- Добавьте логирование действий удаления заказов и сессий в отдельный файл для мониторинга.
- Для больших магазинов лучше запускать удаление партиями, чтобы избежать таймаутов.
- Используйте WP-CLI для ручного запуска и отладки:
wp cron event run wc_delete_old_orders_event. - Если используете Clearfy Pro, можно дополнительно оптимизировать базу и отключить лишние функционалы WooCommerce.
Сравнение методов удаления неактивных заказов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Удаление через WP-Cron и код | Автоматический скрипт на PHP с использованием wp_cron | Гибкость, без дополнительных плагинов | Зависимость от посещаемости сайта, требует навыков разработки |
| Плагины очистки WooCommerce | Готовые инструменты с UI для удаления | Простота, настройка через интерфейс | Дополнительная нагрузка, могут быть платными |
| Ручное удаление через базу данных | SQL-запросы напрямую к базе | Быстро, без нагрузки на сайт | Риск ошибок, требует бэкапа и осторожности |