wp-code.ru wordpress WP-Codе

Как программно удалить заказы WooCommerce по новым статусам

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

В стандартном WooCommerce доступен набор предопределённых статусов заказов (pending, processing, completed, cancelled и др.). Но часто магазины добавляют свои пользовательские статусы для более тонкого управления процессами. В таких случаях возникает задача массового удаления заказов по новым статусам, что не всегда удобно делать вручную через админку.

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

Диагностика: как проверить, что заказы с новыми статусами есть

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

Получение списка всех статусов заказов WooCommerce

add_action('admin_init', function() {
    $statuses = wc_get_order_statuses();
    echo '<pre>';
    print_r($statuses);
    echo '</pre>';
    exit;
});

Этот код добавляем временно в functions.php, затем заходите в админку — увидите массив всех статусов с префиксом wc-. Например:

Array (
  [wc-pending] => Ожидает оплаты
  [wc-processing] => В обработке
  [wc-custom-status] => Мой пользовательский статус
)

Убедитесь, что нужный статус существует и в базе есть заказы с этим статусом.

Проверка наличия заказов с нужным статусом через SQL

SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-custom-status';

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

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

Стандартная функция wp_delete_post() корректно удаляет заказ и все связанные метаданные, но нужно сделать это массово и безопасно.

Код для массового удаления заказов по статусу

function delete_orders_by_status($status) {
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => $status,
        '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 — принудительное удаление без корзины
    }

    return count($orders) . ' заказ(ов) было удалено с статусом ' . $status;
}

// Пример вызова
add_action('admin_init', function() {
    if (current_user_can('manage_woocommerce') && isset($_GET['delete_orders_status'])) {
        $status = sanitize_text_field($_GET['delete_orders_status']);
        echo delete_orders_by_status('wc-' . $status);
        exit;
    }
});

Используйте URL типа https://example.com/wp-admin/?delete_orders_status=custom-status для запуска удаления. Замените custom-status на ваш пользовательский статус без префикса wc-.

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

Проверьте количество заказов в админке WooCommerce и повторите SQL-запрос для подсчёта заказов с этим статусом. Если запрос вернёт 0, значит удаление прошло успешно.

Также убедитесь, что связанные метаданные удалены — проверьте таблицы wp_postmeta на наличие записей с ID удалённых заказов.

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

  • Заказы не удаляются: Проверьте права пользователя. Скрипт запускается только для пользователей с правами manage_woocommerce.
  • Удаляются не все заказы: Возможно, есть ограничения по количеству заказов на запрос. В данном примере мы используем posts_per_page => -1, что должно вернуть все записи. Если база очень большая, лучше делать удаление пакетами.
  • Заказы удаляются, но метаданные остаются: Используйте wp_delete_post() с параметром true для полного удаления.
  • Неправильный статус: Указывайте статус с префиксом wc-. В коде этот момент учтён, но будьте внимательны при вводе параметра.

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

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

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

МетодПлюсыМинусыПрименимость
Ручное удаление через админку WooCommerceПростота, не требует кодаДолго, неудобно при большом количествеМаленькие магазины, единичные удаления
SQL-запросы напрямуюОчень быстроРиск повредить данные, не удаляются метаданныеТолько опытным разработчикам с бэкапом
Программное удаление через wp_delete_post()Безопасно, удаляет все данные, можно автоматизироватьНужно писать код, нагрузка на сервер при больших объёмахАвтоматизация, регулярное обслуживание
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше