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

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

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

Удаление заказов по статусу (например, отменённых или завершённых старше 90 дней) помогает поддерживать базу в оптимальном состоянии без использования тяжёлых плагинов.

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

1. Создание функции удаления заказов

В functions.php вашей темы или в кастомном плагине добавьте функцию, которая будет удалять заказы по заданным статусам и возрасту.

function wptemp_delete_old_wc_orders() {
    global $wpdb;
    $statuses = array('cancelled', 'failed'); // Статусы для удаления
    $days = 90; // Удалять заказы старше 90 дней

    $date_cutoff = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    foreach ( $statuses as $status ) {
        $orders = wc_get_orders(array(
            'limit' => -1,
            'status' => $status,
            'date_created' => '<' . $date_cutoff,
            'return' => 'ids',
        ));

        foreach ( $orders as $order_id ) {
            wp_delete_post( $order_id, true ); // Удаление без перемещения в корзину
        }
    }
}

2. Добавление планировщика задач WP-Cron

Чтобы запускать функцию регулярно, например, раз в сутки, зарегистрируем задачу на WP-Cron.

function wptemp_schedule_order_cleanup() {
    if ( ! wp_next_scheduled( 'wptemp_daily_order_cleanup' ) ) {
        wp_schedule_event( time(), 'daily', 'wptemp_daily_order_cleanup' );
    }
}
add_action( 'wp', 'wptemp_schedule_order_cleanup' );

add_action( 'wptemp_daily_order_cleanup', 'wptemp_delete_old_wc_orders' );

3. Опционально: ручной запуск из админки

Для тестирования или внепланового удаления удобно добавить кнопку в админку.

add_action( 'admin_menu', function() {
    add_submenu_page(
        'woocommerce',
        'Очистка заказов',
        'Очистка заказов',
        'manage_woocommerce',
        'wptemp-order-cleanup',
        'wptemp_order_cleanup_page'
    );
});

function wptemp_order_cleanup_page() {
    if ( isset($_POST['wptemp_cleanup']) ) {
        wptemp_delete_old_wc_orders();
        echo '<div class="notice notice-success is-dismissible">Старые заказы удалены.</div>';
    }
    echo '<form method="post"><input type="submit" name="wptemp_cleanup" class="button button-primary" value="Удалить старые заказы" /></form>';
}

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

1. Проверьте наличие запланированной задачи WP-Cron через плагин WP Crontrol или командой WP-CLI:

wp cron event list --search=wptemp_daily_order_cleanup

2. После запуска (ручного или автоматического) в базе данных должны исчезнуть заказы со статусами cancelled и failed, созданные более 90 дней назад.

3. Проверьте раздел заказов в админке WooCommerce — старые заказы должны быть удалены.

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

  • Заказы не удаляются: Проверьте, что статусы в массиве $statuses совпадают с фактическими статусами заказов. Также убедитесь, что функция запускается (логирование или вывод ошибок).
  • WP-Cron не запускается автоматически: На некоторых хостингах WP-Cron требует внешних вызовов. Проверьте работу WP-Cron или настройте системный Cron на вызов wp-cron.php.
  • Удаление не происходит из-за прав: Убедитесь, что сайт работает с достаточными правами на удаление постов (заказов). Проверьте роли пользователя и права базы данных.
  • Ошибка в логах PHP: Включите WP_DEBUG для детального лога и проверьте ошибки в коде, особенно в запросах и функциях WooCommerce.

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

  • Удаление заказов напрямую влияет на данные магазина — делайте резервные копии перед запуском автоматического удаления.
  • Используйте ограничение по количеству заказов за один проход, если база очень большая, чтобы избежать таймаутов. Например, добавьте параметр 'limit' => 100 и запускайте несколько раз.
  • Для стабильности WP-Cron на больших сайтах лучше настроить системный Cron на вызов wp-cron.php каждые 5-15 минут.
  • Используйте фильтры WooCommerce и WordPress для кастомизации статусов и условий удаления, если необходимо.

Сравнение способов удаления заказов

СпособПреимуществаНедостатки
Удаление через собственный код и WP-CronГибкость, нет лишних плагинов, полный контрольТребует навыков, возможны ошибки без тестирования
Плагины (например, WP Bulk Delete)Удобство, интерфейс, настройки без кодаДополнительная нагрузка, возможные конфликты
Удаление вручную через админкуПростота, не требует навыков программированияНеэффективно при большом объёме заказов
Как создать собственный виджет WordPress: практическое руководство
15.11.2025
Как настроить фильтры в WP REST API для сложных запросов
11.04.2026
WooCommerce: как реализовать авторизацию через социальные сети своими силами
09.06.2026
Как использовать WP-Cron для надежного выполнения задач в WordPress
26.01.2026
WooCommerce: как установить ограничение на количество покупок товара
17.05.2026