WordPress Notes WP-1

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

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

В WooCommerce заказы со статусом pending, failed или cancelled могут накапливаться и занимать место в базе данных, замедляя работу сайта и усложняя аналитику. Особенно если магазин работает давно и не очищается автоматически.

Пользователи часто задаются вопросом, как быстро удалить такие заказы по дате, например, старше 30 дней, чтобы не мешать статистике и не перегружать админку.

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

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

  • Статусы заказов: pending, failed, cancelled
  • Дата создания заказа: старше N дней (например, 30)

2. Создаём функцию удаления заказов

Используем WP_Query для выборки заказов и wp_delete_post для удаления. Пример кода для файла functions.php или отдельного плагина:

function wc_delete_old_unfinished_orders( $days = 30 ) {
    $date_query = array(
        'column' => 'post_date',
        'before' => sprintf( '%d days ago', $days ),
        'inclusive' => true,
    );

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-failed', 'wc-cancelled'),
        'date_query'     => array( $date_query ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $query = new WP_Query( $args );

    if ( ! empty( $query->posts ) ) {
        foreach ( $query->posts as $order_id ) {
            wp_delete_post( $order_id, true ); // true - без перемещения в корзину
        }
    }

    wp_reset_postdata();
}

3. Запуск функции вручную или через WP-Cron

Для разовой очистки вызовите функцию из админки или подключите к вашему плагину:

add_action('admin_init', function() {
    if ( current_user_can('manage_woocommerce') && isset($_GET['delete_old_orders']) ) {
        wc_delete_old_unfinished_orders(30);
        echo 'Удаление старых заказов выполнено.';
    }
});

После этого вызовите https://ваш-сайт.ru/wp-admin/?delete_old_orders=1, чтобы выполнить удаление.

Как проверить, что удаление сработало

  • Перейдите в WooCommerce → Заказы, отфильтруйте по статусам pending, failed, cancelled.
  • Проверьте, что нет заказов старше указанной даты.
  • В базе данных (таблица wp_posts) выполните запрос для проверки:
SELECT ID, post_date, post_status FROM wp_posts 
WHERE post_type = 'shop_order' 
AND post_status IN ('wc-pending','wc-failed','wc-cancelled') 
AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);

Запрос должен вернуть пустой результат.

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

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

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

  • Всегда делайте бэкап базы данных перед массовым удалением.
  • Для больших магазинов разбивайте удаление на партии, например, по 100 заказов за раз.
  • Используйте WP-CLI для удаления заказов, если есть доступ к консоли сервера — это быстрее и надёжнее.
  • Отключайте кэширование страниц и WooCommerce transient cache на время удаления, чтобы избежать рассинхронизации.
  • Регулярно планируйте чистку заказов через WP-Cron, чтобы не накапливать устаревшие данные.

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

МетодОписаниеПлюсыМинусы
Ручное удаление в админкеУдаление заказов через интерфейс WooCommerceПросто, не требует кодаМедленно, неудобно при большом объёме заказов
PHP-функция с WP_QueryПрограммное удаление по статусу и датеГибко, можно автоматизироватьНужно писать код, возможны ошибки при неправильной настройке
WP-CLIУдаление через командную строкуБыстро, эффективно для больших сайтовТребует доступа к серверу и навыков работы с CLI
Плагины очисткиГотовые решения для удаления старых заказовУдобство использованияМогут конфликтовать с другими плагинами, нагрузка на сайт
×
Прокачай свой WordPress!

Скидка -20% на премиум темы и плагины

Воспользоваться сейчас ⋙