WooCommerce: автоматическое отключение неактивных корзин и заказов

Диагностика проблемы неактивных корзин и заказов в WooCommerce

На крупных интернет-магазинах на WooCommerce часто скапливаются неактивные корзины и заказы, которые не были завершены покупателем. Это создает нагрузку на базу данных, замедляет работу сайта и усложняет управление заказами. Чтобы понять масштаб проблемы, нужно проанализировать количество таких записей и их возраст.

Проверить количество неактивных корзин можно через SQL-запрос к базе данных:

SELECT COUNT(*) FROM wp_woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP();

Для заказов, которые не были оплачены и давно не изменялись:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold') AND post_modified < NOW() - INTERVAL 7 DAY;

Если в результате вы видите тысячи записей, стоит автоматизировать их очистку.

Пошаговое решение: автоматическое удаление неактивных корзин и заказов

1. Автоматическое удаление устаревших сессий (корзин)

WooCommerce хранит корзины в таблице wp_woocommerce_sessions с колонкой session_expiry. Можно настроить WP-Cron задачу, которая будет регулярно удалять сессии с истекшим сроком.

function wc_remove_expired_sessions() {
    global $wpdb;
    $table = $wpdb->prefix . 'woocommerce_sessions';
    $time = time();
    $deleted = $wpdb->query( $wpdb->prepare(
        "DELETE FROM $table WHERE session_expiry < %d",
        $time
    ));
    if ( defined('WP_DEBUG') && WP_DEBUG ) {
        error_log('Удалено устаревших сессий: ' . $deleted);
    }
}
add_action('wc_cleanup_expired_sessions', 'wc_remove_expired_sessions');

// Планируем задачу при инициализации
function wc_schedule_session_cleanup() {
    if (! wp_next_scheduled('wc_cleanup_expired_sessions') ) {
        wp_schedule_event(time(), 'hourly', 'wc_cleanup_expired_sessions');
    }
}
add_action('init', 'wc_schedule_session_cleanup');

2. Автоматическое удаление неактивных неоплаченных заказов

Заказы со статусом wc-pending или wc-on-hold, которые не обновлялись длительное время, можно удалять или переводить в статус отмененных.

function wc_delete_old_unpaid_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-on-hold'),
        'date_query'     => array(
            'before' => date('Y-m-d H:i:s', strtotime('-7 days'))
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1
    );
    $orders = get_posts($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true - удаление без корзины
    }
}
add_action('wc_cleanup_old_orders', 'wc_delete_old_unpaid_orders');

// Планируем задачу
function wc_schedule_old_orders_cleanup() {
    if (! wp_next_scheduled('wc_cleanup_old_orders') ) {
        wp_schedule_event(time(), 'daily', 'wc_cleanup_old_orders');
    }
}
add_action('init', 'wc_schedule_old_orders_cleanup');

Проверка результата после внедрения

  • Проверьте таблицу wp_woocommerce_sessions до и после работы cron-задания, число записей должно уменьшиться.
  • Посмотрите в админке WooCommerce, что количество заказов в статусах «Ожидает оплаты» и «На удержании» уменьшилось.
  • Для тестирования можно вручную запустить задачи через WP-CLI:
wp cron event run wc_cleanup_expired_sessions
wp cron event run wc_cleanup_old_orders

Частые ошибки и как их исправить

  • Задачи WP-Cron не запускаются автоматически: Убедитесь, что на сервере есть реальный cron для вызова wp-cron.php или используйте плагин для запуска cron вручную.
  • Удаление заказов приводит к потере данных: Вместо удаления можно менять статус на wc-cancelled, чтобы сохранить историю.
  • Неправильные интервалы времени: Проверьте часовой пояс WordPress, чтобы корректно рассчитывать дату.
  • Проблемы с правами доступа к базе: Убедитесь, что пользователь базы данных имеет права на удаление записей.

Практические советы по безопасности и производительности

  • Создавайте резервные копии перед внедрением автоматического удаления заказов.
  • Регулярно проверяйте логи на наличие ошибок выполнения cron-задач.
  • Для больших магазинов лимитируйте количество удаляемых записей за один запуск, чтобы не перегружать БД.
  • Используйте транзакции или WP-CLI для выполнения массовых операций вне пиковых часов.

Сравнение способов автоматизации очистки

МетодПлюсыМинусы
Код на WP-Cron Гибкость, бесплатный, не требует плагинов Зависит от правильной настройки WP-Cron, нужен опыт
Плагины (например, WP Optimize) Простота, готовые функции, GUI Могут содержать лишний функционал, нагрузка на сайт
Внешние скрипты с cron-серверов Надежность запуска, не зависит от посещаемости сайта Требует доступа к серверу, отдельная настройка
Как изменить URL для AJAX-запросов в WordPress без перезагрузки страницы
15.12.2025
Как добавить динамические фильтры в темы WordPress: практические решения
30.03.2026
Как создать автоматические отзывы с помощью WPRemark в WordPress
16.04.2026
Автоматическое создание бэкапов в WordPress: лучшие способы и примеры кода
17.11.2025
Как создать свой плагин в WordPress: практическое руководство
28.11.2025