Диагностика проблемы: накопление неактивных корзин и заказов
В интернет-магазинах на WooCommerce часто скапливаются неактивные корзины и неоплаченные заказы, которые занимают место в базе данных. Это замедляет работу сайта и усложняет управление заказами. Особенно актуально на крупных проектах с высокой конверсией, где пользователи часто добавляют товары в корзину, но не завершают покупку.
Неактивные корзины — это сессии пользователей, в которых есть товары, но не оформлен заказ. Неактивные заказы — заказы с статусом pending, failed или cancelled, которые не были оплачены и не закрываются автоматически.
Как определить неактивные корзины и заказы в WooCommerce
Для начала нужно понять, какие именно записи считать неактивными и подлежащими удалению:
- Заказы WooCommerce — тип записи
shop_order, с мета-статусом_order_status. - Неактивные заказы — заказы со статусами
pending,failed,cancelledстарше определенного времени (например, 7 дней). - Неактивные корзины — сессии или transient-данные, связанные с корзиной, которые не обновлялись долгое время.
Проверка количества неактивных заказов через SQL
SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-cancelled') AND post_date < NOW() - INTERVAL 7 DAY;Этот запрос покажет, сколько заказов с указанными статусами старше 7 дней.
Пошаговое решение: автоматическое удаление неактивных заказов и корзин с помощью кода
Реализуем функцию, которая будет запускаться по расписанию и удалять такие заказы и очищать корзины.
1. Добавляем хук для wp_cron
add_action('wp', function() {
if (! wp_next_scheduled('custom_clean_inactive_orders')) {
wp_schedule_event(time(), 'daily', 'custom_clean_inactive_orders');
}
});2. Функция удаления заказов старше 7 дней с нужными статусами
add_action('custom_clean_inactive_orders', function() {
global $wpdb;
$statuses = [ 'wc-pending', 'wc-failed', 'wc-cancelled' ];
$date_threshold = date('Y-m-d H:i:s', strtotime('-7 days'));
foreach ($statuses as $status) {
$orders = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
$status, $date_threshold
));
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // удаляем навсегда
}
}
// Очистка устаревших transient с корзинами
$transients = $wpdb->get_col("SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_wc_session_%'");
$now = time();
foreach ($transients as $transient) {
$session_data = get_option($transient);
if (isset($session_data['cart']) && isset($session_data['last_activity'])) {
// Удаляем, если последний доступ был более 7 дней назад
if ($session_data['last_activity'] < $now - 7 * 24 * 3600) {
delete_option($transient);
}
}
}
});3. Как проверить работу
- Через админку WooCommerce проверьте наличие заказов со статусами
pending,failedилиcancelled, созданных более 7 дней назад. - Запустите вручную событие cron через WP CLI:
wp cron event run custom_clean_inactive_orders. - Проверьте, что заказы удалились из базы (через SQL или админку).
- Проверьте, что устаревшие сессии с корзиной удалены (опции в базе с префиксом
_wc_session_).
Частые ошибки и как их исправить
- Крон не запускается автоматически: проверьте, не отключен ли WP Cron, и что на сайте есть посещения — WP Cron запускается при заходе пользователей.
- Удаление заказов не происходит: убедитесь, что в коде используются правильные статусы с префиксом
wc-, напримерwc-pending, а не простоpending. - Удаляются нужные заказы: проверьте условие по дате и при необходимости увеличьте интервал или добавьте дополнительные фильтры.
- Удаление сессий корзины неэффективно: WooCommerce может хранить сессии в базе или в PHP-сессиях, проверьте, что у вас именно опции с префиксом
_wc_session_.
Практические советы по производительности и безопасности
- Для больших магазинов удаление заказов по одному может быть медленным — оптимизируйте через пакетное удаление или SQL-запросы с
DELETE. - Обязательно создавайте резервные копии базы перед автоматическим удалением записей.
- Используйте WP CLI для запуска очистки при больших объемах данных — это снизит нагрузку на сайт.
- Чтобы избежать случайного удаления важных заказов, добавьте дополнительную проверку по метаданным, например, исключите заказы, по которым была произведена частичная оплата или есть комментарии.
Сравнение способов удаления неактивных заказов и корзин
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагин (например, Clearfy Pro) | Простота, интерфейс, регулярные обновления | Зависимость от стороннего кода, может быть тяжеловесным | Использовать для небольших магазинов или без опыта кодинга |
| Код в functions.php | Легковесность, контроль над логикой, кастомизация | Необходимость тестирования, возможные ошибки при обновлениях | Подходит для разработчиков, готовых поддерживать код |
| SQL-запросы напрямую | Максимальная скорость, можно запускать вручную | Риск повредить данные, требует осторожности | Использовать для разовых очисток с резервной копией |