В чем проблема с неактивными корзинами и заказами в WooCommerce?
В интернет-магазинах на WooCommerce часто накапливаются заказы и корзины, которые так и не были завершены покупателями — неактивные корзины и неоплаченные заказы. Они занимают место в базе данных, замедляют работу и усложняют администрирование. Особенно остро это проявляется при большом потоке посетителей.
Автоматическое удаление таких элементов позволит поддерживать базу данных в порядке, уменьшить нагрузку на сервер и повысить скорость работы сайта.
Диагностика проблемы: как определить, что корзины и заказы нужно чистить
- Проверить количество неоплаченных заказов в WooCommerce: в админке перейдите в «WooCommerce» → «Заказы» и отфильтруйте по статусу
pendingилиfailed. - Оценить количество неактивных корзин — для этого нужно знать, что WooCommerce сохраняет сессии пользователей в базе данных в таблицах
wp_woocommerce_sessions(по умолчанию). Можно выполнить запрос к базе, например, через phpMyAdmin:
Этот запрос покажет количество сессий, срок которых истек более суток назад.SELECT COUNT(*) FROM wp_woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP(NOW() - INTERVAL 1 DAY); - Проанализировать нагрузку на базу данных с помощью плагинов типа Query Monitor — если большое число запросов к таблицам сессий и заказов, это повод для оптимизации.
Пошаговое решение: автоматическое удаление неактивных корзин и заказов
1. Автоматическое удаление неактивных корзин
WooCommerce по умолчанию не удаляет просроченные сессии пользователей. Чтобы это исправить, можно добавить следующий код в functions.php вашей темы или в отдельный плагин:
function wptem_clear_expired_sessions() {
global $wpdb;
$expiry = time();
$table = $wpdb->prefix . 'woocommerce_sessions';
$deleted = $wpdb->query(
$wpdb->prepare(
"DELETE FROM {$table} WHERE session_expiry < %d",
$expiry
)
);
return $deleted;
}
add_action('wp_scheduled_delete', 'wptem_clear_expired_sessions');Этот код удаляет из таблицы wp_woocommerce_sessions все записи с истекшим временем сессии при запуске стандартного WP-хука wp_scheduled_delete, который вызывается раз в сутки.
2. Автоматическое удаление неоплаченных заказов старше N дней
Чтобы автоматически удалять неоплаченные заказы (статусы pending, failed) старше, например, 7 дней, используйте следующий код:
function wptem_delete_old_unpaid_orders() {
$days = 7; // период очистки в днях
$args = [
'status' => ['pending', 'failed'],
'date_created' => '<' . ( time() - $days * DAY_IN_SECONDS ),
'limit' => -1,
'return' => 'ids',
];
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
wp_trash_post($order_id); // или wp_delete_post($order_id, true); для удаления без корзины
}
}
add_action('wp_scheduled_delete', 'wptem_delete_old_unpaid_orders');Этот код удалит заказы, которые не были оплачены более 7 дней назад. Можно настроить интервал по своему усмотрению.
Проверка результата после внедрения
- В базе данных через phpMyAdmin проверьте таблицу
wp_woocommerce_sessions— количество записей с истекшим временем сессии должно стремиться к нулю. - В админке WooCommerce проверьте раздел заказов — устаревшие неоплаченные заказы должны быть удалены (перемещены в корзину или удалены полностью).
- Запустите вручную крон-задачу
wp_scheduled_deleteс помощью плагина WP Crontrol или WP-CLI, чтобы проверить, что функция срабатывает без ошибок:
wp cron event run wp_scheduled_deleteЧастые ошибки и как их исправить
- Удаление не происходит: убедитесь, что на сайте работает WP-Cron или настроен системный cron. Без этого код не запустится автоматически.
- Удаляются нужные заказы: проверьте фильтр статусов и период — возможно, стоит добавить дополнительные условия, например, проверку мета-данных заказа.
- Ошибка доступа к базе данных: проверьте префикс таблиц и права пользователя базы данных.
- Удаление сессий не влияет на корзины пользователей: помните, что иногда корзина хранится в cookie на стороне клиента, очистка сессий не всегда полностью сбрасывает корзину для текущих посетителей.
Практические советы по безопасности и производительности
- Используйте
wp_trash_post()вместоwp_delete_post()для возможности восстановления заказов при ошибках. - Не удаляйте заказы без резервной копии базы данных — настройте регулярное автоматическое бэкапирование.
- Проверяйте логи ошибок PHP после внедрения кода, чтобы исключить сбои.
- Оптимизируйте период запуска задач — для очень больших магазинов лучше запускать очистку в ночное время.
- Нужно ли удалять заказы с определенными продуктами? Добавьте дополнительный фильтр в запрос
wc_get_orders.
Сравнение вариантов очистки неактивных корзин и заказов
| Метод | Плагин | Код | Плюсы | Минусы |
|---|---|---|---|---|
| Очистка сессий (корзин) | Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wptem.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udalenie-neaktivnyh-korziny-i-zakazov) | Код из статьи | Плагин — удобство, поддержка, расширенные настройки; код — легковесность, кастомизация | Плагин — нагрузка, цена; код — требует навыков, нет интерфейса |
| Удаление старых заказов | WooCommerce Cleanup Tools | Код из статьи | Плагин — простота, интерфейс; код — гибкость, можно интегрировать в существующие задачи | Плагин — может быть избыточен; код — требует тестирования |