Диагностика проблемы: зачем удалять отменённые и возвращённые заказы в WooCommerce
С течением времени в базе WooCommerce накапливаются заказы со статусами «отменён», «возвращён» и другими, неактуальными для текущей работы магазина. Это замедляет работу административной панели, увеличивает размер базы данных и затрудняет анализ актуальных продаж. Автоматизация удаления таких заказов помогает поддерживать базу в порядке без ручного контроля.
Пошаговое решение: как настроить автоматическое удаление заказов по статусу и дате
1. Определение критериев удаления
В нашем примере удалять будем все заказы со статусами cancelled (отменён) и refunded (возвращён), которым более 30 дней.
2. Создание функции удаления заказов
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:
function wpcontrol_delete_old_cancelled_refunded_orders() {
$statuses = array('cancelled', 'refunded');
$date_query = array(
'column' => 'post_date',
'before' => '30 days ago',
);
foreach ($statuses as $status) {
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-' . $status,
'date_query' => array($date_query),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — без возможности восстановления
}
}
}
}
3. Запуск функции по расписанию с помощью WP-Cron
Добавим событие, которое будет запускать эту функцию раз в сутки.
if (!wp_next_scheduled('wpcontrol_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpcontrol_daily_order_cleanup');
}
add_action('wpcontrol_daily_order_cleanup', 'wpcontrol_delete_old_cancelled_refunded_orders');
Проверка результата после внедрения
- Зайдите в админку WordPress в раздел WooCommerce > Заказы.
- Отфильтруйте заказы по статусам «Отменён» и «Возвращён» и убедитесь, что нет заказов старше 30 дней.
- Проверьте таблицу
wp_postsв базе данных: записи с типомshop_orderи статусамиwc-cancelled,wc-refunded, которым больше 30 дней, должны отсутствовать. - Для ручного теста запустите функцию
wpcontrol_delete_old_cancelled_refunded_orders()через консоль WP-CLI или временно вызовите её из админки и проверьте удаление.
Частые ошибки и их исправление
- Удаление не происходит: Убедитесь, что событие WP-Cron запланировано (проверьте через плагин WP Crontrol). Если сайт не посещается регулярно, WP-Cron не сработает — настройте системный cron для запуска
wp-cron.php. - Удаляются неправильные заказы: Проверьте правильность статусов в массиве и формат даты. Статусы должны начинаться с
wc-. Для нестандартных статусов скорректируйте массив$statuses. - Восстановление заказов невозможно: В функции
wp_delete_post()параметрtrueудаляет пост без корзины. При тестах можно заменить наfalse. - Большая нагрузка при удалении: Если заказов много, разбейте удаление на пакеты, добавив ограничение
posts_per_page(например, 50) и запуск по нескольку раз в крон-задании.
Практические советы по безопасности и производительности
- Перед автоматическим удалением создавайте резервные копии базы данных.
- Для крупных магазинов используйте разбивку выборки заказов на порции и промежуточные паузы между удалениями, чтобы не блокировать базу.
- Если WooCommerce интегрирован с внешними системами учета, убедитесь, что автоматическое удаление не нарушит синхронизацию.
- Используйте плагин Clearfy Pro для оптимизации базы и удаления заказов с расширенными возможностями без кода.
Сравнение способов удаления отменённых заказов
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Код в functions.php + WP-Cron | Гибкий, без плагинов, можно кастомизировать | Требует навыков, риски при ошибках, нет интерфейса | Код из статьи |
| Плагин Clearfy Pro | Интерфейс, дополнительные функции, безопасные операции | Платный, менее гибкий код | Clearfy Pro |
| Ручное удаление через админку | Просто, без кода | Трудоёмко, риск пропуска, не подходит для большого объёма | WooCommerce > Заказы |