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

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

В WooCommerce иногда возникает необходимость массово удалить заказы определённого клиента за конкретный период. Это актуально при тестировании, очистке данных или в случае проблем с некорректными заказами. Стандартный интерфейс WooCommerce не позволяет удалять заказы массово по таким параметрам, поэтому приходится использовать код.

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

1. Подготовка к работе

Перед удалением обязательно сделайте полную резервную копию базы данных и файлов сайта. Удаление заказов необратимо.

2. Использование WP_Query для выборки заказов

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

$customer_id = 123; // ID клиента
$start_date = '2023-01-01';
$end_date = '2023-03-31';

$args = [
    'post_type'      => 'shop_order',
    'post_status'    => ['wc-completed', 'wc-processing', 'wc-on-hold'], // статусы заказов
    'posts_per_page' => -1,
    'meta_query'     => [
        [
            'key'     => '_customer_user',
            'value'   => $customer_id,
            'compare' => '=',
        ],
    ],
    'date_query'     => [
        [
            'after'     => $start_date,
            'before'    => $end_date,
            'inclusive' => true,
        ],
    ],
];

$query = new WP_Query($args);

3. Удаление заказов программно

После выборки заказов удаляем каждый через функцию wp_delete_post() с параметром true для полного удаления без перемещения в корзину:

if ($query->have_posts()) {
    foreach ($query->posts as $order_post) {
        wp_delete_post($order_post->ID, true);
    }
} else {
    echo 'Заказы не найдены';
}

4. Полный пример кода для файла functions.php или отдельного плагина

function wpdev_delete_customer_orders_by_date($customer_id, $start_date, $end_date) {
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-completed', 'wc-processing', 'wc-on-hold'],
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_customer_user',
                'value'   => $customer_id,
                'compare' => '=',
            ],
        ],
        'date_query'     => [
            [
                'after'     => $start_date,
                'before'    => $end_date,
                'inclusive' => true,
            ],
        ],
    ];

    $query = new WP_Query($args);

    if (!$query->have_posts()) {
        return 'Заказы не найдены для удаления.';
    }

    foreach ($query->posts as $order_post) {
        wp_delete_post($order_post->ID, true);
    }

    return count($query->posts) . ' заказ(ов) успешно удалено.';
}

// Запуск функции (пример)
echo wpdev_delete_customer_orders_by_date(123, '2023-01-01', '2023-03-31');

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

  • Перейдите в WooCommerce → Заказы и проверьте, что заказы выбранного клиента за указанный период отсутствуют.
  • Используйте SQL-запрос в базе данных, например:
SELECT COUNT(*) FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'shop_order'
AND pm.meta_key = '_customer_user' AND pm.meta_value = 123
AND p.post_date BETWEEN '2023-01-01' AND '2023-03-31';
<

Результат должен быть 0.

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

  • Неверный ID клиента: Убедитесь, что $customer_id соответствует именно ID пользователя в WordPress, а не какой-либо другой параметр.
  • Неправильный формат даты: Даты должны быть в формате YYYY-MM-DD. В противном случае date_query не сработает.
  • Удаление не происходит: Проверьте права пользователя, от имени которого запускается код. Для удаления заказов нужны права администратора.
  • Заказы не удаляются полностью: Параметр wp_delete_post должен быть true для полного удаления без перемещения в корзину.
  • Потеря данных: Всегда делайте резервную копию перед массовым удалением.

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

  • Запускайте скрипт вручную в безопасной среде (локально или staging), а не при каждом запросе на продакшене.
  • Если заказов очень много, разбивайте удаление на части с помощью пагинации, чтобы избежать таймаутов PHP.
  • Ограничьте доступ к функции удаления только администраторам, например, через проверку current_user_can('manage_woocommerce').
  • Для регулярной очистки используйте WP-Cron с осторожностью и логируйте результаты.
  • Используйте отладку через error_log или WP_DEBUG для отслеживания проблем.

Сравнение вариантов удаления заказов WooCommerce

МетодПлюсыМинусы
Удаление через WP_Query и wp_delete_post()Точный контроль, можно указать параметры выборки, работает через стандартный API WordPress.Может занимать время при большом объёме, требует навыков программирования.
Плагины массового удаления заказовПростота для непрофессионалов, готовые интерфейсы.Могут не поддерживать фильтрацию по всем нужным параметрам, риск безопасности.
Удаление напрямую через SQLБыстрота и возможность сложных запросов.Риск повреждения данных, обходит логику WooCommerce и WP.
Как создать уникальный фильтр для записей WordPress по нескольким параметрам
27.12.2025
Удаление заказов WooCommerce по статусу и дате через код
20.05.2026
Как удалить все продажи WooCommerce по дате и статусу
19.04.2026
Удаление продаж WooCommerce по дате и статусу: практическое руководство
03.05.2026
Автоматическое создание категорий при импорте записей в WordPress
21.03.2026