Диагностика задачи: зачем и когда нужно удалять заказы по статусу
В WooCommerce накапливаются заказы с разными статусами: завершённые, отменённые, ожидающие оплаты и т. п. Иногда требуется автоматически удалять заказы с определённым статусом, например, отменённые или просроченные, чтобы не перегружать базу данных и не мешать аналитике.
Стандартного механизма в WooCommerce для автоматического удаления заказов по статусу нет, поэтому приходится реализовывать это через кастомный код или сторонние плагины.
Пошаговое решение: автоматическое удаление заказов по статусу с помощью WP-Cron и кода
1. Создание функции удаления заказов
В файле functions.php вашей активной темы или в собственном плагине добавьте следующий код, который удаляет заказы с указанным статусом:
function wpstuff_delete_orders_by_status( $status = 'cancelled' ) {
if ( ! in_array( $status, wc_get_order_statuses(), true ) ) {
return;
}
$args = array(
'status' => $status,
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true ); // жесткое удаление
}
}2. Регистрация события WP-Cron для периодического удаления
Добавьте планировщик задач, который будет запускать удаление раз в сутки:
function wpstuff_schedule_order_deletion() {
if ( ! wp_next_scheduled( 'wpstuff_daily_order_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wpstuff_daily_order_cleanup' );
}
}
add_action( 'wp', 'wpstuff_schedule_order_deletion' );
add_action( 'wpstuff_daily_order_cleanup', function() {
wpstuff_delete_orders_by_status( 'cancelled' );
});3. Альтернатива: запуск удаления по крону сервера
Если WP-Cron не срабатывает стабильно из-за низкого трафика, настройте системный cron на сервере для вызова скрипта wp-cron.php или создайте кастомный CLI-скрипт для удаления заказов.
Проверка результата: как убедиться, что заказы удаляются
- Перейдите в WooCommerce → Заказы и фильтруйте по нужному статусу (например, "Отменённые").
- После запуска WP-Cron (можно вызвать вручную через плагин WP Crontrol или посетив фронтенд сайта) проверьте, исчезли ли заказы с этим статусом.
- Для отладки вставьте
error_logвнутри функции удаления, чтобы логировать ID удаляемых заказов.
Частые ошибки и как их исправить
- Неверный статус заказа: Функция ничего не удалит, если передан несуществующий статус. Проверьте статус через
wc_get_order_statuses(). - Отсутствие прав на удаление: Убедитесь, что код выполняется в контексте администратора или с достаточными правами.
- WP-Cron не запускается: Используйте плагин WP Crontrol для проверки и запуска задач вручную, либо настройте системный cron.
- Удаляются не те заказы: Используйте фильтры в запросе
wc_get_ordersи проверяйте параметры.
Практические советы по безопасности и производительности
- Всегда используйте жесткое удаление
wp_delete_post( $order_id, true )с осторожностью — данные удаляются без возможности восстановления. - Перед удалением сделайте резервную копию базы данных, особенно если удаляете много заказов.
- Ограничивайте количество удаляемых заказов за один запуск, если заказов очень много, чтобы избежать таймаутов.
- Логируйте действия удаления для аудита и быстрого выявления ошибок.
Сравнение способов удаления заказов по статусу
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron + кастомный код | Гибкость, полный контроль, бесплатно | Зависит от работы WP-Cron, требует навыков программирования |
| Плагины очистки заказов (например, "WooCommerce Delete Orders") | Простота настройки, интерфейс | Могут быть платными, меньше контроля |
| Ручное удаление через админку | Безопасно, без кода | Не подходит для больших объемов, требует времени |