WooCommerce: автоматическое удаление заказов по статусу с помощью PHP

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

В WooCommerce со временем накапливаются заказы с разными статусами, например, cancelled, failed или pending. Это увеличивает нагрузку на базу данных, замедляет генерацию отчётов и ухудшает производительность сайта. Удаление таких заказов вручную неудобно и рискованно, особенно при большом количестве. Поэтому автоматизация удаления заказов по статусу — актуальная задача для оптимизации WooCommerce-магазина.

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

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

Для начала напишем PHP-функцию, которая будет удалять все заказы с заданным статусом. Используем WP_Query для выборки заказов и функцию wp_delete_post() для удаления.

function wc_delete_orders_by_status( $status = 'cancelled' ) {
    if ( ! in_array( $status, wc_get_order_statuses(), true ) ) {
        return false; // Неверный статус
    }

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-' . $status,
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];

    $query = new WP_Query( $args );

    if ( empty( $query->posts ) ) {
        return 0; // Нет заказов для удаления
    }

    foreach ( $query->posts as $order_id ) {
        wp_delete_post( $order_id, true ); // Удаление без отправки в корзину
    }

    return count( $query->posts );
}

2. Запускаем функцию вручную или по расписанию

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

echo wc_delete_orders_by_status('cancelled'); // Удалит все отменённые заказы

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

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

add_action( 'wc_cleanup_cancelled_orders', function() {
    $deleted_count = wc_delete_orders_by_status( 'cancelled' );
    error_log( "Удалено заказов со статусом cancelled: $deleted_count" );
} );

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

Для проверки работоспособности:

  • В админке WooCommerce проверьте наличие заказов со статусом, который вы указали (например, cancelled).
  • Запустите функцию вручную или дождитесь выполнения WP-Cron (зависит от настроек хостинга).
  • Проверьте, что заказы с этим статусом исчезли из списка заказов.
  • Проверьте логи PHP (error_log), чтобы убедиться в успешном удалении и отсутствии ошибок.

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

  • Неправильный статус заказа. WooCommerce использует префикс wc- для статусов. Убедитесь, что передаете статус без префикса, например, cancelled, а в запросе добавляется wc-.
  • Отсутствие прав на удаление. Если функция вызывается от имени пользователя без прав администратора, удаление может не пройти. Запускайте код от администратора или через WP-CLI.
  • Крон-задачи не срабатывают. На некоторых хостингах WP-Cron не работает без посещений сайта. Для теста используйте WP-CLI или настройте системный cron.
  • Удаление не происходит, заказы остаются. Проверьте, что заказы действительно имеют нужный статус, а не находятся в другом статусе или в архиве.

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

  • Перед массовым удалением сделайте резервную копию базы данных.
  • Не удаляйте заказы, которые могут понадобиться для учёта или отчетности без консультации с бухгалтерией.
  • Для больших магазинов с тысячами заказов делайте удаление порционно, чтобы избежать тайм-аутов.
  • Используйте WP-CLI для запуска скриптов удаления, если сервер поддерживает.
  • Ограничьте доступ к функциям удаления через проверки прав пользователя или IP-адреса.

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

МетодПреимуществаНедостатки
Ручной запуск функции из functions.php Простота, быстрое тестирование Требует вмешательства, риск забыть
WP-Cron задача Автоматизация, регулярность Зависит от посещений сайта, возможны задержки
WP-CLI с системным cron Надежность, подходит для больших сайтов Требует доступа по SSH, навыков работы с консолью
⭐⭐⭐⭐⭐