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

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

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

Первым шагом проверьте, насколько велика проблема. Для этого зайдите в базу данных через phpMyAdmin и выполните запросы:

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-failed') AND DATEDIFF(NOW(), post_date) > 7;

Если количество таких записей велико (сотни и более), пора автоматизировать их удаление.

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

Удаление устаревших сессий WooCommerce

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

function wptem_delete_expired_woocommerce_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 $deleted expired WooCommerce sessions.");
    }
}

if ( ! wp_next_scheduled( 'wptem_daily_delete_expired_sessions' ) ) {
    wp_schedule_event( time(), 'daily', 'wptem_daily_delete_expired_sessions' );
}
add_action( 'wptem_daily_delete_expired_sessions', 'wptem_delete_expired_woocommerce_sessions' );

Этот код добавьте в файл functions.php вашей дочерней темы или в отдельный плагин. Он будет ежедневно очищать таблицу от старых сессий.

Удаление неактивных заказов WooCommerce

Для заказов с статусом wc-pending или wc-failed, которые не обновлялись более 7 дней, можно использовать подобный cron:

function wptem_delete_old_inactive_orders() {
    $args = array(
        'post_type' => 'shop_order',
        'post_status' => array('wc-pending', 'wc-failed'),
        'date_query' => array(
            array(
                'column' => 'post_date',
                'before' => '7 days ago'
            ),
        ),
        'posts_per_page' => -1,
        'fields' => 'ids',
    );
    $orders = get_posts( $args );
    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }
    if ( defined('WP_DEBUG') && WP_DEBUG ) {
        error_log('Deleted ' . count($orders) . ' old inactive WooCommerce orders.');
    }
}

if ( ! wp_next_scheduled( 'wptem_daily_delete_inactive_orders' ) ) {
    wp_schedule_event( time(), 'daily', 'wptem_daily_delete_inactive_orders' );
}
add_action( 'wptem_daily_delete_inactive_orders', 'wptem_delete_old_inactive_orders' );

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

После активации кода проверьте логи ошибок (если включён WP_DEBUG) — там должно быть сообщение с количеством удалённых записей. Также вручную выполните запросы из раздела диагностики, чтобы убедиться, что количество неактивных корзин и заказов уменьшилось.

Для отладки можно вызвать функции вручную через консоль WP-CLI:

wp eval 'wptem_delete_expired_woocommerce_sessions();'
wp eval 'wptem_delete_old_inactive_orders();'

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

  • Код не выполняется: проверьте, что WP-Cron активен и нет конфликтов с другими плагинами, которые могут блокировать задачи.
  • Удаляются нужные заказы: убедитесь, что в запросе фильтруются только статусы wc-pending и wc-failed, а также правильный период (>7 дней).
  • Ошибка в SQL-запросе: используйте $wpdb->prepare() для безопасной подстановки параметров.
  • Отсутствие логов: включите define('WP_DEBUG', true); и define('WP_DEBUG_LOG', true); в wp-config.php для отладки.

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

  • Добавляйте проверки прав пользователя, если планируете запускать очистку вручную через админку.
  • Не увеличивайте частоту cron-заданий выше одного раза в сутки, чтобы не перегружать базу.
  • Регулярно делайте бэкапы базы, особенно перед внедрением автоматического удаления данных.
  • Для крупных магазинов с тысячами заказов лучше использовать пакетную обработку — удалять по частям с помощью пагинации.

Сравнение вариантов автоматического удаления неактивных корзин и заказов

МетодПлюсыМинусыПример
WP-Cron + собственный кодГибкость настройки, без сторонних плагиновТребует базовых знаний PHP, зависит от WP-CronКод из статьи
Плагины очистки WooCommerce (например, WooCommerce Cleanup)Простой интерфейс, настройки через админкуМогут иметь лишний функционал, нагрузка на сайтClearfy Pro — подходит для комплексной оптимизации
Ручное удаление через SQLБыстро и эффективноРиск ошибочных удалений, требует доступа к базеSQL-запросы из раздела диагностики
WooCommerce: автоматическое изменение стоимости товара при определённых условиях
04.08.2026
Как создать автоматический плагин обновления данных в WordPress
15.12.2025
Автоматическое изменение robots.txt в WordPress: практические решения и примеры кода
11.04.2026
Как изменить адрес AJAX в WordPress без перезагрузки страницы
15.01.2026
Автоматическое отменение заказов в WooCommerce после неудачной оплаты
23.04.2026