Диагностика проблемы: зачем нужно удалять заказы автоматически
В интернет-магазинах на WooCommerce со временем накапливается множество заказов, которые уже не актуальны — отменённые, просроченные, не оплаченные. Это может замедлить работу базы данных, увеличить размер бэкапов и создать сложности при аналитике. Удаление заказов вручную неудобно на больших объемах, поэтому автоматизация процедуры становится необходимой.
Как настроить автоматическое удаление заказов по статусу и срокам
Использование WP-Cron для регулярной очистки
Для удаления заказов по заданным условиям без установки плагинов можно задействовать WP-Cron — штатный планировщик задач WordPress. Ниже приведён пример кода, который удаляет заказы со статусом cancelled и датой создания старше 30 дней.
function wc_auto_delete_old_cancelled_orders() {
$args = array(
'limit' => -1,
'status' => 'cancelled',
'date_created' => '<' . ( time() - MONTH_IN_SECONDS ),
'return' => 'ids',
);
$orders = wc_get_orders( $args );
if ( ! empty( $orders ) ) {
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
}
}
add_action( 'wc_daily_order_cleanup', 'wc_auto_delete_old_cancelled_orders' );
// Планируем событие, если оно не запланировано
if ( ! wp_next_scheduled( 'wc_daily_order_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wc_daily_order_cleanup' );
}Код можно добавить в файл functions.php вашей темы или в кастомный плагин. В данном примере удаляются заказы со статусом cancelled старше 30 дней (30 дней = MONTH_IN_SECONDS).
Как изменить период и статус для удаления
Чтобы удалить заказы с другим статусом, замените 'status' => 'cancelled' на нужный статус, например 'failed' или массив статусов array('failed', 'cancelled'). Для изменения срока используйте значение в секундах, например 7 дней — 7 * DAY_IN_SECONDS.
Проверка результата после внедрения кода
- Убедитесь, что в базе есть заказы со статусом и датой старше установленного срока.
- Проверьте, что событие
wc_daily_order_cleanupзапланировано черезwp cron event list(можно использовать плагин WP Crontrol). - Принудительно вызовите функцию через админку или WP-CLI для теста:
do_action('wc_daily_order_cleanup'); - Проверьте, что заказы удалились (раздел WooCommerce - Заказы).
Частые ошибки и как их исправить
- Удаление не происходит: проверьте, запущен ли WP-Cron. Если сайт не получает трафик, задачи могут не запускаться. Решение — настроить системный cron или запускать WP-Cron вручную.
- Удаляются не те заказы: убедитесь, что статус заказа указан корректно и формат даты соответствует требованиям
wc_get_orders(). - Ошибка памяти или таймаута при удалении большого количества заказов: добавьте постраничное удаление заказов, например, по 50 за раз.
Практические советы по безопасности и производительности
- Удаляйте заказы с параметром
force_delete = trueвwp_delete_post()для полного удаления без перемещения в корзину. - Ограничьте количество удаляемых заказов за один запуск, чтобы не перегружать сервер.
- Регулярно делайте резервные копии базы данных перед автоматическим удалением.
- Для сайтов с большим трафиком рассмотрите использование системного cron для запуска WP-Cron.
Дополнительный пример: постепенное удаление заказов по страницам
function wc_paginated_order_deletion() {
$args = array(
'limit' => 50,
'status' => 'failed',
'date_created' => '<' . ( time() - 14 * DAY_IN_SECONDS ),
'return' => 'ids',
);
$orders = wc_get_orders( $args );
if ( ! empty( $orders ) ) {
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
}
}
add_action( 'wc_hourly_order_cleanup', 'wc_paginated_order_deletion' );
if ( ! wp_next_scheduled( 'wc_hourly_order_cleanup' ) ) {
wp_schedule_event( time(), 'hourly', 'wc_hourly_order_cleanup' );
}Этот код удаляет заказы со статусом failed старше 14 дней по 50 штук каждый час, уменьшая нагрузку на сервер.
Сравнение подходов для автоматизации удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Непрактично для большого количества заказов, трудозатратно |
| Плагины (например, WooCommerce Order Cleaner) | Удобный интерфейс, настройка без кода | Дополнительная нагрузка, возможные конфликты, требует обновлений |
| Код на WP-Cron (как в статье) | Гибко, без сторонних зависимостей, можно адаптировать под задачи | Требует навыков, нужно контролировать работу cron, возможны ошибки при больших объёмах |