Как удалить незаконченые и завершённые заказы WooCommerce через PHP

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

Интернет-магазины на WooCommerce часто сталкиваются с накоплением множества заказов в статусах «незакончен» и «завершён». Это приводит к росту базы данных, замедлению админки и увеличению времени бэкапов. Удалять заказы вручную неудобно и рискованно. Автоматизация удаления через PHP позволяет регулярно чистить базу, освобождая ресурсы и улучшая производительность.

Какие заказы подлежат удалению?

  • Незаконченые заказы: обычно имеют статусы pending, failed, cancelled, которые не были оплачены или отменены.
  • Завершённые заказы: со статусом completed, которые не нужны для отчетности или были обработаны давно (например, старше 90 дней).

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

1. Использование WP-CLI для безопасного запуска

Рекомендуется запускать массовое удаление через WP-CLI, чтобы избежать таймаутов и нагрузок на сайт.

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

<?php
function wpac_delete_woocommerce_orders( $statuses = array('cancelled', 'failed', 'pending'), $older_than_days = 30 ) {
    if ( ! class_exists( 'WooCommerce' ) ) {
        error_log('WooCommerce не активен');
        return;
    }

    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d H:i:s', strtotime("-{$older_than_days} days")),
        'inclusive' => true,
    );

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

    $orders = get_posts( $args );

    if ( empty( $orders ) ) {
        error_log('Заказы для удаления не найдены');
        return;
    }

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }

    error_log( 'Удалено заказов: ' . count( $orders ) );
}

// Пример вызова: удалить заказанные более 30 дней назад с указанными статусами
// wpac_delete_woocommerce_orders( array('cancelled', 'failed', 'pending'), 30 );
?>

3. Автоматизация с помощью WP-Cron

Чтобы запускать очистку автоматически, добавьте хук в functions.php:

<?php
add_action( 'wpac_delete_old_orders_daily', 'wpac_scheduled_delete_orders' );
function wpac_scheduled_delete_orders() {
    wpac_delete_woocommerce_orders( array('cancelled', 'failed', 'pending'), 30 );
    wpac_delete_woocommerce_orders( array('completed'), 90 );
}

if ( ! wp_next_scheduled( 'wpac_delete_old_orders_daily' ) ) {
    wp_schedule_event( time(), 'daily', 'wpac_delete_old_orders_daily' );
}
?>

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

  • В админке WooCommerce проверьте количество заказов в статусах, указанных для удаления.
  • В логах сервера (error_log) должно появиться сообщение о количестве удалённых заказов.
  • Для WP-Cron можно использовать плагин WP Crontrol для просмотра и запуска запланированных задач вручную.
  • Проверьте, что заказы действительно удалились из базы данных (таблица wp_posts с типом shop_order).

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

  • Заказы не удаляются: проверьте, активен ли WooCommerce и правильно ли переданы статусы заказов.
  • Удаление занимает слишком много времени: разбейте удаление на батчи по 50-100 заказов, используя пагинацию в get_posts.
  • Нарушение логики бизнеса: убедитесь, что удаление заказов не нарушает требования бухгалтерии и законодательства.
  • WP-Cron не запускается: проверьте, что на сервере разрешен запуск wp-cron.php, либо настроен системный cron.

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

  • Всегда делайте резервные копии базы данных перед массовым удалением.
  • Запускайте удаление в ночное время или периоды низкой нагрузки.
  • Добавьте проверку прав текущего пользователя, если функция вызывается из административной части.
  • Используйте транзакции базы данных, если требуется атомарность операций (на уровне MySQL).
  • Для больших магазинов рассмотрите использование отдельного скрипта через WP-CLI с ограничением по времени и объёму.

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

МетодПлюсыМинусыПример
Удаление через админкуПросто, без кодаРучной труд, неэффективно для большого объёмаWooCommerce > Заказы > Фильтры
Плагины (например, WP Sweep)Удобно, автоматизацияЗависимость от стороннего кода, нагрузкаClearfy Pro
Кастомный PHP-скрипт с WP-CronГибкость, интеграция под задачиТребует навыков, необходимость тестированияПример кода в статье
Как правильно сделать удалённый раздел админки WordPress для клиентов
04.03.2026
Как создать собственный виджет в WordPress: подробное руководство
30.11.2025
Как добавить поддержку WebP в WordPress без плагинов
23.12.2025
Как избежать проблем с отправкой писем через PHP mail() в WordPress
03.05.2026
Удаление неиспользуемых таблиц в базе данных WordPress: безопасный метод
23.01.2026