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

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

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

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

Как определить заказы для удаления: фильтрация по статусу и дате

Для удаления выбирайте статусы заказов, которые не переходят в успешные, например:

  • pending — ожидает оплаты;
  • failed — неудачная оплата;
  • cancelled — отменённые пользователем;
  • on-hold — ожидают ручного подтверждения.

Также важно ориентироваться на дату создания заказа, чтобы не удалять свежие заказы, которые могут быть еще в процессе обработки.

Пошаговое решение: удаление заказов через WP-CLI и PHP-код

Способ 1: удаление через WP-CLI (рекомендуется для удобства и скорости)

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

wp post delete $(wp post list --post_type=shop_order --post_status=pending,failed,on-hold --date_query_column=post_date --date_query_before='30 days ago' --format=ids) --force

Этот однострочник удалит заказы со статусами pending, failed, on-hold, созданные более 30 дней назад.

Способ 2: удаление заказов через кастомный PHP-скрипт

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

function wp1_delete_old_unfinished_orders() {
    $statuses = array('pending', 'failed', 'on-hold');
    $date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));
    
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses,
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date_threshold,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );
    
    $orders = get_posts($args);
    if (empty($orders)) {
        return;
    }
    
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true — безвозвратно
    }
}

Для запуска в админке добавьте временный хук:

add_action('admin_init', function() {
    if (current_user_can('manage_woocommerce') && isset($_GET['delete_old_orders'])) {
        wp1_delete_old_unfinished_orders();
        wp_redirect(admin_url());
        exit;
    }
});

После добавления можно вызвать по адресу https://ваш-сайт/wp-admin/?delete_old_orders=1.

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

  • Перейдите в раздел WooCommerce → Заказы и примените фильтр по статусам (pending, failed, on-hold) с датой старше 30 дней — заказы должны отсутствовать.
  • Проверьте размер базы данных — он должен уменьшиться, особенно таблицы wp_posts и wp_postmeta.
  • При использовании WP-CLI можно вывести количество оставшихся заказов через wp post list --post_type=shop_order --post_status=pending,failed,on-hold --format=count.

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

  • Удаление не всех заказов: проверьте правильность статусов и даты в аргументах запроса. Статусы должны строго совпадать с теми, что используются в WooCommerce.
  • Заказы не удаляются из-за прав доступа: убедитесь, что запуск кода происходит под пользователем с правами manage_woocommerce или с админ-правами.
  • Память PHP или время выполнения скрипта ограничены: при большом количестве заказов разбейте удаление на части или используйте WP-CLI.
  • Удаление заказов приводит к потере важных данных: всегда делайте резервную копию базы данных перед массовым удалением.

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

  • Ограничьте удаление заказов только определёнными статусами и датой, чтобы случайно не удалить активные или недавно созданные заказы.
  • Для регулярного удаления настройте WP-Cron с запуском функции удаления, например, раз в неделю.
  • Используйте WP-CLI для удаления в больших магазинах — это быстрее и надежнее, чем через PHP.
  • Очищайте также связанные метаданные заказов — функция wp_delete_post() удаляет их автоматически.
  • Отслеживайте логи ошибок и успешные удаления, если используете автоматизацию.

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

МетодПлюсыМинусы
WP-CLIБыстро, эффективно, подходит для больших баз данныхТребует SSH-доступа, знания командной строки
PHP-скриптМожно интегрировать в админку, подходит для автоматизацииМожет быть медленнее, требует контроля времени выполнения
Как использовать user meta в WordPress для сохранения дополнительных данных
24.01.2026
Автоматическое удаление заказов WooCommerce по дате и статусу
09.05.2026
Удаление заказов WooCommerce по дате и статусу
01.05.2026
Как автоматически очистить библиотеку медиа в WordPress от неиспользуемых файлов
28.03.2026
Как удалить заблокированные аккаунты пользователей WordPress
06.02.2026