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

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

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

Чтобы проверить наличие таких записей, выполните SQL-запросы через phpMyAdmin или WP-CLI:

-- Кол-во неактивных корзин (сессий) в пользовательских метаданных или плагинах корзины
SELECT COUNT(*) FROM wp_woocommerce_sessions;

-- Кол-во заказов со статусом 'pending' старше 30 дней
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending' AND post_date < NOW() - INTERVAL 30 DAY;

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

1. Удаление старых заказов с определённым статусом

Самый простой способ — создать крон-задачу, которая будет удалять заказы со статусом wc-pending (ожидающие оплаты) старше заданного периода (например, 30 дней).

function wptem_delete_old_pending_orders() {
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-pending',
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => '30 days ago',
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];
    $orders = get_posts($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }
}
add_action('wptem_daily_cleanup', 'wptem_delete_old_pending_orders');

2. Планирование CRON задачи

Чтобы запускать функцию ежедневно, добавьте в файл functions.php или плагин следующее:

if (!wp_next_scheduled('wptem_daily_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wptem_daily_cleanup');
}

3. Удаление старых сессионных данных корзины WooCommerce

WooCommerce хранит данные сессий в таблице wp_woocommerce_sessions. Для очистки старых сессий используйте прямой SQL-запрос через WPDB:

function wptem_cleanup_woocommerce_sessions() {
    global $wpdb;
    $expiration = time() - (30 * DAY_IN_SECONDS); // 30 дней
    $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM {$wpdb->prefix}woocommerce_sessions WHERE session_expiry < %d",
            $expiration
        )
    );
}
add_action('wptem_daily_cleanup', 'wptem_cleanup_woocommerce_sessions');

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

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

  • В базе данных в таблице wp_posts уменьшилось количество заказов со статусом wc-pending старше 30 дней.
  • В таблице wp_woocommerce_sessions удалены записи с истёкшим session_expiry.
  • Сайт работает быстрее, что видно в панели администратора.

Для ручного запуска задачи в тестовой среде используйте WP-CLI:

wp cron event run wptem_daily_cleanup

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

  • CRON не запускается: Проверьте, что у вас включён WP-Cron. Если сайт низконагружен, лучше настроить системный cron на вызов wp-cron.php.
  • Удаление не происходит: Проверьте, что функция wp_delete_post вызывается с флагом true для полного удаления, а не в корзину.
  • Ошибки SQL при очистке сессий: Убедитесь, что префикс таблиц совпадает с вашим, и вы используете глобальный объект $wpdb.
  • Потеря важных заказов: Не удаляйте заказы с другими статусами, например wc-completed или wc-processing.

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

  • Всегда делайте резервную копию базы данных перед внедрением автоматических удалений.
  • Ограничьте удаление только заказами со статусом, на который не влияет бизнес-процесс.
  • Добавьте логирование удалённых заказов для аудита, например:
function wptem_log_deleted_order($order_id) {
    error_log('Deleted order ID: ' . $order_id);
}
  • Если база очень большая, разбивайте удаление на порции по 100-200 заказов, чтобы избежать таймаутов.
  • Для очистки сессий используйте транзакции или отдельные запросы, если таблица очень большая.

Сравнение вариантов удаления заказов и корзин

МетодПлюсыМинусыРекомендуется для
WP Cron + wp_delete_postПростой, интегрируется с WPЗависит от WP-Cron, может не сработать при низкой активностиМаленькие и средние магазины
Системный cron + wp-cliНадежный, запускается независимо от посещаемостиТребует доступа к серверу и настройки cronБольшие магазины, с высоким трафиком
Ручные SQL-запросыОчень быстрый, минимальная нагрузкаРиск удаления лишнего, требует знаний SQLОпытные админы, при больших объемах данных
Автоматическое отменение заказов в WooCommerce после неудачной оплаты
23.04.2026
Как сделать автоматический импорт товара из Excel в WordPress
01.03.2026
WooCommerce: автоматическое удаление неактивных корзин и заказов
21.06.2026
Как отключить Emoji в WordPress: эффективные методы
23.01.2026
Как создать автоматический импорт товара из Excel в WordPress
07.04.2026