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

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

WooCommerce не удаляет заказы автоматически — они накапливаются и с течением времени замедляют работу базы данных. Часто приходится массово чистить заказы, но стандартные методы требуют заходить в админку и вручную удалять записи, что неудобно и долго. Автоматизация через AJAX позволяет выполнять удаление заказов по определённым критериям прямо из интерфейса без перезагрузки страницы.

Подготовка: создание AJAX-запроса для удаления заказов

Для начала создадим обработчик AJAX-запроса на стороне сервера и подключим вызов из JS. В нашем примере будем удалять заказы старше 180 дней со статусами 'completed' и 'cancelled'.

1. Добавление PHP-обработчика в functions.php или в плагин

add_action('wp_ajax_delete_old_wc_orders', 'delete_old_wc_orders_callback');

function delete_old_wc_orders_callback() {
    // Проверка прав пользователя
    if (!current_user_can('manage_woocommerce')) {
        wp_send_json_error('Недостаточно прав');
        wp_die();
    }

    $days = 180; // количество дней
    $statuses = ['completed', 'cancelled'];
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'status' => $statuses,
        'date_created' => '<' . $date,
        'limit' => -1,
        'return' => 'ids'
    ];

    $orders = wc_get_orders($args);

    if (empty($orders)) {
        wp_send_json_success('Заказы не найдены');
        wp_die();
    }

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // Жесткое удаление
    }

    wp_send_json_success(count($orders) . ' заказов удалено');
    wp_die();
}

2. Подключение скрипта и создание кнопки для вызова AJAX

Добавим кнопку в админку или на страницу настроек, а также JS для отправки запроса:

add_action('admin_enqueue_scripts', 'enqueue_delete_orders_script');
function enqueue_delete_orders_script() {
    wp_enqueue_script('delete-old-orders', get_template_directory_uri() . '/js/delete-old-orders.js', ['jquery'], null, true);
    wp_localize_script('delete-old-orders', 'deleteOrdersAjax', [
        'ajaxurl' => admin_url('admin-ajax.php')
    ]);
}
<button id="delete-old-orders-btn">Удалить старые заказы</button>
<div id="delete-old-orders-result"></div>
jQuery(document).ready(function($) {
    $('#delete-old-orders-btn').on('click', function() {
        $('#delete-old-orders-result').html('Удаление...');
        $.post(deleteOrdersAjax.ajaxurl, {
            action: 'delete_old_wc_orders'
        }, function(response) {
            if(response.success) {
                $('#delete-old-orders-result').html('<span style="color:green;">' + response.data + '</span>');
            } else {
                $('#delete-old-orders-result').html('<span style="color:red;">' + response.data + '</span>');
            }
        });
    });
});

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

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

  • Зайдите в WooCommerce > Заказы и убедитесь, что старые заказы со статусами 'completed' и 'cancelled' отсутствуют.
  • Проверьте количество заказов до и после.
  • Можно запустить запрос к базе (через phpMyAdmin или WP CLI) для проверки:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-completed','wc-cancelled') AND post_date < DATE_SUB(NOW(), INTERVAL 180 DAY);

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

  • Ошибка 403 или недостаточно прав. Проверьте capability manage_woocommerce и что пользователь авторизован.
  • Заказы не удаляются, хотя запрос успешен. Убедитесь, что wp_delete_post вызывается с параметром true для полного удаления. Проверьте, нет ли плагинов, блокирующих удаление.
  • AJAX не срабатывает. Проверьте правильность подключения JS, наличие admin-ajax.php и корректность action.
  • Слишком долгий запрос. Если заказов очень много, делайте удаление партиями и/или добавьте прогресс-бар.

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

  • Всегда проверяйте права доступа в AJAX-обработчике.
  • Для больших магазинов лучше реализовать поэтапное удаление заказов через AJAX с пагинацией.
  • Используйте wp_schedule_event для периодической очистки заказов без вмешательства пользователя.
  • Создайте резервную копию базы перед массовым удалением.
  • Для повышения производительности можно отключить триггеры и кеширование на время удаления, если вы уверены в безопасности операции.

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

МетодПлюсыМинусыКому подходит
Ручное удаление через админкуПросто, не требует кодаМедленно, неудобно для большого числа заказовМаленькие магазины
Плагины очистки заказовАвтоматизация, удобный интерфейсМожет нагрузить сайт, лишний плагинСредние и крупные магазины
Скрипт с AJAX без плагинов (как в статье)Легко кастомизировать, быстроТребует навыков, риск ошибок без тестовРазработчики, технические специалисты
Как создать автоматический импорт товара из Excel в WooCommerce без плагинов
17.02.2026
WooCommerce: как автоматически удалять товары без запаса
26.05.2026
Запрет доступа по IP в WordPress через .htaccess: решение задачи защиты
27.12.2025
Как отключить Emoji в WordPress для ускорения загрузки сайта
15.03.2026
Как создать внешний API для WordPress с поддержкой авторизации
23.12.2025