Диагностика проблемы: зачем удалять старые заказы через 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 без плагинов (как в статье) | Легко кастомизировать, быстро | Требует навыков, риск ошибок без тестов | Разработчики, технические специалисты |