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

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

В интернет-магазинах на WooCommerce часто накапливаются заказы со статусом "ожидает оплаты" (pending) или "в обработке" (processing), которые не были завершены или оплачены. Они занимают место в базе данных, замедляют отчеты и усложняют управление заказами. Особенно актуальна эта проблема для магазинов с высокой посещаемостью и большим количеством заказов.

Чтобы проверить, насколько велика проблема, выполните следующий SQL-запрос к базе данных:

SELECT post_status, COUNT(ID) as count FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

Он покажет, сколько заказов в каждом статусе. Если количество заказов в статусах wc-pending или wc-processing значительно превышает реальное число активных заказов, стоит задуматься об автоматической очистке.

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

1. Определяем критерии удаления

Как правило, заказы со статусом wc-pending старше 7 дней можно удалять, так как это означает, что покупатель не завершил оплату.

Заказы со статусом wc-cancelled или wc-failed старше 30 дней тоже можно удалять для очистки базы.

2. Реализуем периодическую задачу с помощью WP-Cron

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

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

function wpabout_cleanup_old_orders_callback() {
    global $wpdb;
    $pending_cutoff = date( 'Y-m-d H:i:s', strtotime( '-7 days' ) );
    $old_cutoff = date( 'Y-m-d H:i:s', strtotime( '-30 days' ) );

    // Удаляем wc-pending старше 7 дней
    $pending_orders = $wpdb->get_col( $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-pending' AND post_date < %s",
        $pending_cutoff
    ) );

    // Удаляем cancelled и failed старше 30 дней
    $old_orders = $wpdb->get_col( $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND (post_status = 'wc-cancelled' OR post_status = 'wc-failed') AND post_date < %s",
        $old_cutoff
    ) );

    $orders_to_delete = array_merge( $pending_orders, $old_orders );

    foreach ( $orders_to_delete as $order_id ) {
        wp_delete_post( $order_id, true ); // true - принудительное удаление
    }
}
add_action( 'wpabout_cleanup_old_orders', 'wpabout_cleanup_old_orders_callback' );

3. Запуск задачи вручную для теста

Для проверки работы можно временно добавить вызов функции напрямую:

add_action('init', function() {
    if ( current_user_can('administrator') && isset($_GET['run_order_cleanup']) ) {
        wpabout_cleanup_old_orders_callback();
        echo 'Очистка заказов выполнена';
        exit;
    }
});

После вызова перейдите по адресу https://ваш_сайт/?run_order_cleanup=1 под администратором. Убедитесь, что заказы удалились.

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

  • Повторите SQL-запрос из раздела диагностики, чтобы убедиться, что количество устаревших заказов уменьшилось.
  • Проверьте логи сервера на предмет ошибок выполнения WP-Cron.
  • Убедитесь, что заказы, которые должны оставаться (например, завершённые и новые), не были удалены.

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

  • WP-Cron не запускается автоматически: стандартный WP-Cron зависит от посещаемости сайта. Для стабильной работы настройте системный cron на сервере или используйте плагины для управления cron.
  • Удаление заказов не происходит: проверьте, есть ли права на удаление у процесса PHP, а также корректность префикса таблиц wp_.
  • Удаляются не те заказы: уточните критерии фильтрации, проверьте правильность условий в SQL-запросах.
  • Потеря данных: обязательно делайте резервные копии перед внедрением автоматического удаления.

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

  • Для больших баз данных удаляйте заказы небольшими партиями, чтобы избежать нагрузки и тайм-аутов. Например, добавьте лимит в запросы и делайте несколько проходов.
  • Логируйте удалённые заказы в отдельный файл для аудита.
  • Используйте Clearfy Pro для дополнительной оптимизации и очистки базы WooCommerce.

Сравнение методов очистки заказов WooCommerce

МетодОписаниеПлюсыМинусы
Ручное удаление через админкуУдаление старых заказов вручнуюПростота и контрольТрудозатратно, неэффективно для большого объёма
WP-Cron с кастомным кодомАвтоматическая очистка с помощью кодаАвтоматизация, гибкостьЗависит от работы WP-Cron, требует навыков разработки
Плагины для очистки WooCommerceПлагины, например, WP-Optimize или ClearfyУдобство, дополнительные функцииМожет влиять на производительность, требует проверки совместимости
WooCommerce: как добавить поле дополнительной информации в форму оформления заказа
15.07.2026
Удаление неиспользуемых таксономий в WordPress: практическое руководство
09.02.2026
WooCommerce: автоматическое изменение стоимости товара при изменении количества
26.04.2026
Как создать собственный REST API endpoint в WordPress
13.11.2025
Как автоматически удалять черновики старше 30 дней в WordPress
25.03.2026