Диагностика проблемы: почему важно удалять забытые корзины и заказы в WooCommerce
Забытые корзины и незавершённые заказы на WooCommerce накапливаются в базе данных, занимая место и замедляя работу сайта. Особенно это заметно на больших магазинах с большим трафиком. Кроме того, старые заказы могут загромождать панели администрирования, усложняя управление продажами и анализ.
Проверить количество забытых корзин и старых заказов можно в базе данных, например, через phpMyAdmin, выполнив запросы:
SELECT COUNT(*) FROM wp_woocommerce_sessions WHERE session_key IS NOT NULL;
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending' AND post_date < DATE_SUB(NOW(), INTERVAL 7 DAY);Первый запрос показывает количество «сессий» корзин, второй — незавершённых заказов старше 7 дней.
Пошаговое решение: автоматическое удаление забытых корзин и старых заказов
1. Автоматическое удаление сессий корзины
WooCommerce хранит данные корзины в таблице wp_woocommerce_sessions. По умолчанию сессии очищаются через 48 часов, но можно настроить автоматическое удаление через WP-Cron.
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
function clear_old_woocommerce_sessions() {
global $wpdb;
$expiration = 48 * HOUR_IN_SECONDS; // 48 часов
$threshold = time() - $expiration;
$table = $wpdb->prefix . 'woocommerce_sessions';
$deleted = $wpdb->query(
$wpdb->prepare(
"DELETE FROM $table WHERE session_expiry < %d",
$threshold
)
);
return $deleted;
}
if ( ! wp_next_scheduled( 'clear_woocommerce_sessions_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'clear_woocommerce_sessions_hook' );
}
add_action( 'clear_woocommerce_sessions_hook', 'clear_old_woocommerce_sessions' );Этот код удаляет сессии старше 48 часов каждый час.
2. Автоматическое удаление старых незавершённых заказов
Незавершённые (например, со статусом wc-pending или wc-cancelled) заказы старше определённого срока можно удалять автоматически.
Добавьте следующий код:
function delete_old_pending_orders() {
$days = 7; // удалять заказы старше 7 дней
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-pending', 'wc-cancelled'],
'date_query' => [
[
'column' => 'post_date',
'before' => "$days days ago",
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$orders = get_posts($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // без возможности восстановления
}
}
if ( ! wp_next_scheduled( 'delete_old_pending_orders_hook' ) ) {
wp_schedule_event( time(), 'daily', 'delete_old_pending_orders_hook' );
}
add_action( 'delete_old_pending_orders_hook', 'delete_old_pending_orders' );Проверка результата после внедрения
- Через час после добавления кода проверьте таблицу
wp_woocommerce_sessions— количество записей должно уменьшиться. - Через сутки проверьте наличие старых заказов с помощью запроса SQL или в админке WooCommerce — заказы старше 7 дней со статусами
wc-pendingиwc-cancelledдолжны быть удалены. - Для проверки работы WP-Cron можно использовать плагин
WP Crontrolили вызвать хук вручную через консоль WP-CLI:
wp cron event run clear_woocommerce_sessions_hook
wp cron event run delete_old_pending_orders_hookЧастые ошибки и как их исправить
- WP-Cron не запускается на сервере: некоторые хостинги блокируют WP-Cron. Решение — настроить системный cron для вызова
wp-cron.phpили использовать реальные cron задачи. - Удаление заказов не работает: проверьте, что у пользователя, под которым запускается WP, есть права на удаление заказов. Также убедитесь, что не стоит плагин, запрещающий удаление заказов.
- Удаление сессий не влияет на корзины: корзина может храниться в куках браузера. Убедитесь, что сессии очищаются, и браузер не сохраняет старые данные.
Практические советы по производительности и безопасности
- Регулярное удаление старых данных уменьшает размер базы и ускоряет запросы.
- Не удаляйте заказы, которые могут быть нужны для отчетности без резервной копии.
- Для крупных магазинов с миллионами записей рекомендуем использовать серверные cron задачи, а не WP-Cron.
- Обязательно делайте резервные копии перед включением автоматического удаления.
Сравнение вариантов реализации автоматического удаления
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| WP-Cron с хуками (код в functions.php) | Простота реализации, не требует доступа к серверу | Зависит от посещений сайта, может не запускаться вовремя | Подходит для небольших и средних сайтов |
| Настройка системного cron с WP-CLI | Надежность и точность запуска, подходит для больших сайтов | Требует доступа к серверу и базовых навыков работы с консолью | Рекомендуется для крупных WooCommerce магазинов |
| Плагины для очистки базы | Удобный интерфейс, дополнительные функции оптимизации | Могут быть избыточными, нагрузка на сайт | Использовать с осторожностью, проверять совместимость |