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

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

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

Чтобы понять, есть ли у вас такая проблема, выполните запрос к базе данных через phpMyAdmin или WP-CLI, заменив wc_order_status_* на нужный статус:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending';

Если количество заказов в статусе «wc-pending» или других — несколько сотен или тысяч, стоит рассмотреть автоматизацию их удаления через Cron и PHP.

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

1. Создаем PHP-функцию для удаления заказов по статусу и дате

Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:

function wpzen_delete_old_inactive_orders() {
    $days = 30; // количество дней, старше которых заказы будут удаляться
    $statuses = array('wc-pending', 'wc-failed'); // статусы заказов для удаления

    $date_query = array(
        'column' => 'post_date',
        'before' => "$days days ago",
        'inclusive' => true,
    );

    $args = array(
        'post_type' => 'shop_order',
        'post_status' => $statuses,
        'date_query' => array($date_query),
        'posts_per_page' => -1,
        'fields' => 'ids',
    );

    $orders = get_posts($args);

    if (empty($orders)) {
        return;
    }

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // принудительное удаление
    }
}

2. Регистрируем Cron-задачу для автоматизации

Чтобы функция запускалась, например, ежедневно, добавьте в functions.php:

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

add_action('wpzen_daily_delete_inactive_orders', 'wpzen_delete_old_inactive_orders');

3. Добавление очистки Cron при деактивации (рекомендуется)

function wpzen_clear_scheduled_delete_orders() {
    $timestamp = wp_next_scheduled('wpzen_daily_delete_inactive_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpzen_daily_delete_inactive_orders');
    }
}
register_deactivation_hook(__FILE__, 'wpzen_clear_scheduled_delete_orders');

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

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

  • В админке используйте плагин Cron Manager или WP-CLI: wp cron event list и найдите wpzen_daily_delete_inactive_orders.
  • Запустите задачу вручную через WP-CLI: wp cron event run wpzen_daily_delete_inactive_orders, затем проверьте, что старые заказы удалились.
  • Проверьте количество заказов в статусах wc-pending и wc-failed старше 30 дней через запрос к базе (как в диагностике).

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

  • Функция не запускается по Cron: проверьте, что WP-Cron работает, или настройте системный Cron для вызова wp-cron.php.
  • Удаляются не те заказы: проверьте параметры $statuses и $days, возможно, они не соответствуют вашим требованиям.
  • Заказы не удаляются полностью: убедитесь, что используется wp_delete_post($order_id, true) с принудительным удалением.
  • Проблемы с производительностью при большом количестве заказов: если заказов слишком много, разбивайте удаление на части с помощью пагинации.

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

  • Перед внедрением сделайте резервную копию базы данных.
  • Используйте дочернюю тему или отдельный плагин для кастомного кода, чтобы избежать потери при обновлении.
  • Если у вас много заказов, оптимизируйте функцию с разбивкой на порции по 100-200 заказов для удаления за раз.
  • Ограничьте список статусов и количество дней, чтобы не удалять нужные заказы.

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

МетодОписаниеПлюсыМинусы
Плагин (например, WP Bulk Delete) Готовое решение с интерфейсом для удаления заказов по условиям Просто в настройке, не требует программирования Может нагружать сайт, ограниченная гибкость
Кастомный код + WP-Cron Пишется вручную, гибко под ваши задачи Максимальный контроль, нет лишних функций Требует навыков разработки, возможны ошибки
Системный Cron + Скрипт PHP Запуск через серверный Cron для надежности Не зависит от посещаемости сайта, стабильность Настройка на сервере сложнее, нужен доступ к хостингу
Как удалить пустые таблицы базы данных в WordPress
05.03.2026
Как создать динамические подписки на новые посты WordPress с уведомлениями по email
12.04.2026
Как создать динамическую форму обратной связи на WordPress с AJAX
01.03.2026
Как избежать конфликтов между плагинами в WordPress
04.01.2026
Как создать и подключить собственный шорткод в WordPress
10.11.2025