Диагностика задачи: зачем и когда нужно удалять заказы по статусу
В WooCommerce накопление заказов с определённым статусом (например, отменённые или проваленные) может замедлять работу магазина и затруднять управление базой данных. Автоматическое удаление таких заказов помогает поддерживать чистоту и оптимальную производительность сайта. В стандартном функционале WooCommerce нет возможности массово удалять заказы по статусу через интерфейс, поэтому задача решается через кастомный код.
Как определить заказы для удаления
WooCommerce хранит заказы как записи постов типа shop_order с разными статусами, например:
wc-pending— ожидает оплаты;wc-cancelled— отменён;wc-failed— провален;wc-completed— выполнен;wc-processing— обрабатывается.
Для удаления чаще всего выбирают заказы со статусами wc-cancelled или wc-failed, т.к. они неактивны и не несут ценности для аналитики.
Пошаговое решение: добавляем функцию для удаления заказов по статусу
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
function wpeasy_delete_orders_by_status($status = 'wc-cancelled', $older_than_days = 30) {
$date_query = array(
'before' => date('Y-m-d', strtotime("-" . $older_than_days . " days")),
'inclusive' => true,
);
$args = array(
'post_type' => 'shop_order',
'post_status' => $status,
'date_query' => array($date_query),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
if (empty($orders)) {
return 0;
}
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — удаление без перемещения в корзину
}
return count($orders);
}Эта функция удалит все заказы с указанным статусом старше определённого количества дней. По умолчанию — отменённые заказы старше 30 дней.
Пример вызова функции вручную
add_action('init', function() {
if (isset($_GET['delete_old_cancelled_orders'])) {
$deleted = wpeasy_delete_orders_by_status('wc-cancelled', 30);
echo "Удалено заказов: " . $deleted;
exit;
}
});Теперь, перейдя по адресу https://ваш-сайт.ru/?delete_old_cancelled_orders=1, вы запустите удаление заказов. Не оставляйте этот код включённым на продакшене без защиты.
Проверка результата после внедрения
- Перейдите в админку WooCommerce → Заказы и отфильтруйте заказы по нужному статусу.
- Проверьте, что заказы старше указанного срока исчезли.
- Можно также проверить таблицу
wp_postsв базе данных — записи сpost_type = 'shop_order'и соответствующим статусом должны быть удалены.
Частые ошибки и их исправление
- Ничего не удаляется: Проверьте правильность статуса — он должен начинаться с
wc-, например,wc-cancelled. Статусы без префикса не сработают. - Удаление не происходит из-за кеширования: Очистите кеш сайта и браузера, если используете плагины кеширования.
- Удалённые заказы не удаляются из базы полностью: Используйте
wp_delete_post($id, true)с параметромtrueдля полного удаления, а не перемещения в корзину. - Удаление запускается на каждом запросе: Не забудьте убрать или защитить от вызова функцию удаления после теста.
Практические советы по безопасности и производительности
- Резервное копирование: Перед массовым удалением заказов обязательно сделайте бэкап базы данных.
- Пакетное удаление: Если заказов очень много, лучше удалять их пакетами, чтобы избежать таймаутов PHP.
function wpeasy_delete_orders_batch($status = 'wc-cancelled', $older_than_days = 30, $batch_size = 50) { $date_query = array( 'before' => date('Y-m-d', strtotime("-" . $older_than_days . " days")), 'inclusive' => true, ); $args = array( 'post_type' => 'shop_order', 'post_status' => $status, 'date_query' => array($date_query), 'posts_per_page' => $batch_size, 'fields' => 'ids', ); $orders = get_posts($args); if (empty($orders)) { return 0; } foreach ($orders as $order_id) { wp_delete_post($order_id, true); } return count($orders); } - Безопасный вызов: Используйте WP-CLI для запуска скрипта из командной строки без риска случайного вызова через URL.
- Автоматизация: Для регулярного удаления можно настроить WP-Cron, но лучше использовать системный cron через WP-CLI, чтобы избежать проблем с пропущенными заданиями.
Сравнение вариантов удаления заказов по статусу
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Медленно, не массово | Мало заказов, единичные случаи |
| Кодовая функция в functions.php | Автоматизация, гибкость | Требует навыков, риск ошибок | Регулярное удаление, большие объёмы |
| Плагин для массового удаления заказов | Удобный интерфейс | Может быть платным, конфликтовать | Для админов без навыков кода |
| WP-CLI команда | Оптимально для больших сайтов, быстрая работа | Требует доступа к серверу | Профессиональная администрирование |