Как удалить незаконченные заказы WooCommerce по дате и статусу

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

Незаконченные заказы (статус pending, failed или on-hold) накапливаются в базе данных WooCommerce и могут замедлять работу сайта, создавать путаницу в отчетах и мешать аналитике. Особенно актуально для магазинов с большим трафиком и нестабильной оплатой.

Проверьте, сколько таких заказов у вас сейчас: в админке WooCommerce перейдите в Заказы и отфильтруйте по статусу. Для точной диагностики выполните SQL-запрос через phpMyAdmin или wp-cli:

SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-on-hold');

Если число превышает несколько тысяч, стоит планировать удаление.

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

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

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

function delete_woocommerce_orders_by_status_and_date( $statuses = array('wc-pending', 'wc-failed'), $days_old = 30 ) {
    if ( empty($statuses) ) {
        return;
    }
    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . intval($days_old) . ' days'));
    // Получаем ID заказов
    $placeholders = implode(',', array_fill(0, count($statuses), '%s'));
    $query = $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ($placeholders) AND post_date < %s",
        ...$statuses, $date_threshold
    );
    $order_ids = $wpdb->get_col($query);
    if ( empty($order_ids) ) {
        return;
    }
    foreach ( $order_ids as $order_id ) {
        wp_delete_post( $order_id, true ); // true - без перемещения в корзину
    }
}

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

Временно вызовите функцию через admin-ajax.php или в консоли WP-CLI:

delete_woocommerce_orders_by_status_and_date(['wc-pending', 'wc-failed'], 30);

Параметры:

  • $statuses — массив статусов заказов для удаления;
  • $days_old — удалить заказы старше указанного количества дней.

3. Автоматизация через WP-Cron

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

// Регистрируем событие
if ( ! wp_next_scheduled( 'delete_old_woocommerce_orders' ) ) {
    wp_schedule_event( time(), 'daily', 'delete_old_woocommerce_orders' );
}

// Хук на событие
add_action( 'delete_old_woocommerce_orders', function() {
    delete_woocommerce_orders_by_status_and_date(['wc-pending', 'wc-failed'], 30);
});

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

Проверьте количество заказов с нужными статусами снова SQL-запросом или через админку. Если число значительно уменьшилось — операция прошла успешно.

Также проверьте логи WooCommerce и работу сайта: заказы с удалёнными ID не должны отображаться, ошибки отсутствуют.

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

  • Удаление не происходит: проверьте права пользователя, под которым выполняется скрипт, и корректность подключения к базе.
  • Удаляются не те заказы: убедитесь, что в массиве $statuses указаны правильные статусы с префиксом wc-.
  • Заказы не удаляются полностью: wp_delete_post с параметром true удаляет пост полностью, без этого — в корзину. Возможно, вы вызываете функцию с параметром false.
  • WP-Cron не срабатывает: проверьте, работает ли планировщик задач на вашем хостинге (cron должен запускаться), или настройте системный cron для вызова wp-cron.php.

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

  • Перед удалением сделайте резервную копию базы данных.
  • Для больших магазинов можно удалять партии заказов по 100-200 штук за раз, чтобы не нагружать сервер.
  • Для мониторинга добавьте вывод логов или уведомления после выполнения удаления.
  • Регулярно обновляйте WooCommerce и плагины, чтобы избежать конфликтов с WP-Cron и функциями удаления.

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

МетодПреимуществаНедостатки
Ручное удаление через админкуПростота, нет кодаТрудозатратно при большом объеме заказов
SQL-запросы через phpMyAdminБыстрое удалениеРиск удалить связанные данные, требует знаний SQL
PHP-функция с WP-CronАвтоматизация, безопасноНужно настроить cron, написать код
Как избежать конфликтов между плагинами в WordPress: практические советы и примеры кода
25.12.2025
Как удалить неиспользуемые метаключи в WordPress
20.01.2026
Как удалить или отключить XML-RPC в WordPress
17.02.2026
Как удалить все черновики (draft) из базы данных WordPress
05.12.2025
Как отключить AJAX в WooCommerce на отдельных страницах
28.04.2026