Диагностика задачи: почему нужно удалять заказы по дате и статусу
В WooCommerce иногда возникает необходимость массово удалить заказы, например, старые отменённые или неудачные заказы, чтобы очистить базу данных и снизить нагрузку. Вручную это делать неудобно, особенно при большом объёме данных. Плагинов для массового удаления заказов по фильтрам не всегда хватает, а сторонние решения могут быть ненадёжными или влиять на производительность.
Поэтому оптимальное решение — написать собственный скрипт, использующий WP_Query и стандартные функции WooCommerce для выборки и удаления заказов по конкретным датам и статусам.
Пошаговое решение: создание скрипта для удаления заказов
Шаг 1. Определяем параметры выборки заказов
Для удаления нам нужны два основных параметра:
- Дата создания заказа — например, удалить все заказы старше 6 месяцев;
- Статус заказа — например, только отменённые (
cancelled) или отменённые и неудачные (failed).
Шаг 2. Создаём WP_Query для выборки заказов
Используем объектный запрос с параметром post_type = 'shop_order' и мета-запросом по статусу заказа. Дату фильтруем через параметр date_query.
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-cancelled', 'wc-failed'], // статусы с префиксом wc-
'date_query' => [
[
'before' => '6 months ago',
'inclusive' => true,
],
],
'posts_per_page' => -1, // получаем все
'fields' => 'ids', // нужны только ID
];
$query = new WP_Query($args);Шаг 3. Удаляем заказы программно через wc_delete_order()
После получения ID заказов удаляем их в цикле. Функция wc_delete_order() корректно удаляет заказ и связанные данные.
if (!empty($query->posts)) {
foreach ($query->posts as $order_id) {
wc_delete_order($order_id);
}
}Шаг 4. Создаём исполняемый PHP-скрипт
Оптимально разместить код в отдельном PHP-файле в корне сайта или в папке темы и запускать через WP-CLI или через браузер (с дополнительной защитой). Пример минимального скрипта для запуска через браузер:
add_action('init', function() {
if (!is_admin() && isset($_GET['delete_old_orders']) && $_GET['delete_old_orders'] === '1') {
if (!current_user_can('manage_woocommerce')) {
wp_die('Нет доступа');
}
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-cancelled', 'wc-failed'],
'date_query' => [
['before' => '6 months ago', 'inclusive' => true],
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$query = new WP_Query($args);
$count = 0;
if (!empty($query->posts)) {
foreach ($query->posts as $order_id) {
wc_delete_order($order_id);
$count++;
}
}
wp_die("Удалено заказов: $count");
}
});Проверка результата после внедрения
Чтобы проверить, что скрипт сработал:
- Перед запуском сделайте резервную копию базы данных;
- Запустите скрипт, например, перейдя по адресу https://example.com/?delete_old_orders=1;
- После выполнения вы увидите сообщение с количеством удалённых заказов;
- В админке WooCommerce проверьте, что заказы с нужным статусом и датой удалены;
- Проверьте таблицы
wp_postsиwp_postmeta— записи должны отсутствовать.
Частые ошибки и как их исправить
- Ничего не удаляется: Проверьте правильность статусов — они должны иметь префикс
wc-, например,wc-cancelled, а не простоcancelled. - Удаляются не те заказы: Проверьте параметр
date_queryи формат даты. Можно отладить, выведя список ID перед удалением. - Ошибка прав доступа: Убедитесь, что пользователь, запускающий скрипт, имеет capability
manage_woocommerce. - Скрипт занимает много памяти или времени: При очень большом количестве заказов делайте удаление партиями, например по 100 заказов за раз.
Практические советы по безопасности и производительности
- Никогда не запускайте массовое удаление без резервного копирования базы.
- Ограничьте доступ к скрипту через проверку прав или IP.
- Для большого объёма данных используйте WP-CLI — он работает быстрее и не ограничен таймаутами PHP.
- Для удаления партиями используйте параметр
'posts_per_page' => 100и реализуйте повторный запуск с оффсетом. - Используйте транзакции базы или плагин Clearfy для оптимизации и очистки базы после удаления.
Сравнение вариантов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление в админке WooCommerce | Просто, не требует навыков | Медленно, неудобно при большом количестве |
| Плагины массового удаления | Удобный интерфейс | Могут быть платными, конфликтовать с другими плагинами |
| Код на PHP (WP_Query + wc_delete_order) | Гибко, быстро, под контролем разработчика | Требует навыков PHP, возможны ошибки при неправильном коде |
| WP-CLI скрипты | Самый быстрый и безопасный метод | Требует доступа к серверу и знаний командной строки |