Диагностика проблемы: зачем автоматизировать удаление старых заказов
В магазинах на WooCommerce со временем накапливается много заказов с различными статусами — отменённые, просроченные, неоплаченные. Это увеличивает нагрузку на базу данных и затрудняет администрирование. Ручное удаление неэффективно и занимает время, поэтому логично автоматизировать процесс удаления заказов, которые не актуальны после определённого времени.
Как настроить автоматическое удаление заказов по истечении срока
1. Определяем критерии удаления
Обычно удаляют заказы со статусом cancelled, failed или pending, которые старше N дней. В примере возьмём 30 дней.
2. Используем WP-Cron для регулярного запуска задачи
Добавим кастомный хук, который будет проверять и удалять старые заказы. Для этого в functions.php темы или в собственном плагине добавьте следующий код:
if ( ! wp_next_scheduled( 'wpkpi_delete_old_wc_orders' ) ) {
wp_schedule_event( time(), 'daily', 'wpkpi_delete_old_wc_orders' );
}
add_action( 'wpkpi_delete_old_wc_orders', 'wpkpi_delete_old_wc_orders_callback' );
function wpkpi_delete_old_wc_orders_callback() {
$days = 30; // количество дней
$statuses = array( 'cancelled', 'failed', 'pending' );
$args = array(
'status' => $statuses,
'date_created' => '<' . ( time() - DAY_IN_SECONDS * $days ),
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order_id ) {
wp_trash_post( $order_id ); // перемещаем в корзину
// или wp_delete_post( $order_id, true ); // сразу удалять без корзины
}
}3. Регистрация кастомного интервала (если нужно)
По умолчанию в WP-Cron есть интервал 'daily'. Если хотите запускать чаще или реже, добавьте кастомный интервал:
add_filter( 'cron_schedules', function( $schedules ) {
$schedules['every_three_days'] = array(
'interval' => DAY_IN_SECONDS * 3,
'display' => 'Каждые 3 дня'
);
return $schedules;
} );И замените в wp_schedule_event параметр 'daily' на 'every_three_days'.
Как проверить, что автоматическое удаление работает
- Проверьте наличие запланированной задачи в админке WP в разделе
Инструменты > Запланированные событияс помощью плагина WP Crontrol. - Создайте тестовый заказ со статусом
cancelledи датой создания более 30 дней назад (можно изменить дату напрямую в базе). - Принудительно запустите событие через WP Crontrol или дождитесь следующего запуска по расписанию.
- Проверьте, что заказ либо перемещён в корзину, либо удалён (в зависимости от используемой функции).
Частые ошибки и как их исправить
- Заказы не удаляются: убедитесь, что WP-Cron работает. На некоторых хостингах он отключён. Для проверки включите логирование или используйте плагин WP Crontrol.
- Удаляются не те заказы: проверьте правильность списка статусов и параметров даты в
wc_get_orders. Используйте дебаг, выводя количество найденных заказов. - Удаление приводит к ошибкам: избегайте одновременного удаления очень большого количества заказов. Можно добавить лимит и обрабатывать партиями.
Практические советы по безопасности и производительности
- Используйте
wp_trash_post(), чтобы иметь возможность восстановить заказ при ошибке. - Не устанавливайте слишком частый запуск задачи — достаточно 1 раз в день или 1 раз в 3 дня.
- Добавьте логирование удалённых заказов, чтобы иметь историю и контролировать процесс.
- Если магазин большой, делайте удаление пакетами, например по 50 заказов за один запуск, чтобы не перегружать сервер.
- Регулярно очищайте корзину заказов, так как WP хранит удалённые записи в корзине.
Сравнение подходов удаления заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| wp_trash_post() | Безопасно, можно восстановить удалённые заказы | Накопление записей в корзине, требует дополнительной очистки |
| wp_delete_post( $order_id, true ) | Удаляет сразу, экономит место в базе | Нет возможности восстановления, риск потери данных |
| Плагины для очистки базы | Удобный интерфейс, доп. функции оптимизации | Может быть избыточно, риск ошибок, нагрузка на сервер |