Диагностика задачи: зачем и когда нужно удалять заказы автоматически
В стандартной установке WooCommerce заказы не удаляются автоматически. Это может привести к засорению базы данных, особенно если магазин работает с большим количеством тестовых или отменённых заказов. Автоматическое удаление заказов по статусу (например, отменённые или неоплаченные) и по времени помогает поддерживать базу данных в актуальном состоянии и повышает производительность магазина.
Пошаговое решение: как настроить автоматическое удаление заказов
1. Создание кастомной функции удаления заказов
Для начала напишем функцию, которая удалит заказы с заданным статусом, созданные старше определённого количества дней.
function wpb_delete_old_orders_by_status( $days = 30, $status = 'cancelled' ) {
$args = [
'limit' => -1,
'status' => $status,
'date_created' => '<' . ( time() - ( DAY_IN_SECONDS * $days ) ),
'return' => 'ids',
];
$orders = wc_get_orders( $args );
if ( empty( $orders ) ) {
return 0;
}
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
return count( $orders );
}2. Запуск функции с помощью WP-Cron
Чтобы удаление происходило автоматически, подключим функцию к планировщику задач WordPress.
add_action( 'wpb_delete_old_orders_event', 'wpb_delete_old_orders_cron' );
function wpb_delete_old_orders_cron() {
$deleted = wpb_delete_old_orders_by_status( 30, 'cancelled' );
if ( $deleted ) {
error_log( "Удалено $deleted заказов со статусом 'cancelled' старше 30 дней." );
}
}
// Регистрируем событие при активации темы или плагина
if ( ! wp_next_scheduled( 'wpb_delete_old_orders_event' ) ) {
wp_schedule_event( time(), 'daily', 'wpb_delete_old_orders_event' );
}
// Очистка при деактивации
function wpb_deactivation_cleanup() {
wp_clear_scheduled_hook( 'wpb_delete_old_orders_event' );
}
register_deactivation_hook( __FILE__, 'wpb_deactivation_cleanup' );Проверка результата после внедрения
Чтобы убедиться, что удаление отработало корректно:
- Перейдите в админку WooCommerce → Заказы и проверьте наличие заказов с указанным статусом старше 30 дней.
- Проверьте лог ошибок PHP (error_log) на наличие записей об удалении заказов.
- Выполните вручную функцию
wpb_delete_old_orders_by_statusс меньшим интервалом дней для теста через WP-CLI или подключив временно вызов в код.
Частые ошибки и как их исправить
- Отсутствие записей в error_log: убедитесь, что логирование ошибок включено, либо используйте альтернативный способ уведомления (email, запись в отдельный файл).
- Функция не вызывается по расписанию: проверьте, что WP-Cron работает (например, через плагин WP Crontrol). Если сайт с низким трафиком, рассмотрите настройку системного cron для вызова wp-cron.php.
- Заказы не удаляются: проверьте, что статус у заказов совпадает с указанным в функции, и что заказы старше нужного срока.
- Удаление не полное: wp_delete_post с вторым параметром true удаляет заказ и все связанные данные. Если заказ связан с внешними плагинами, проверьте совместимость.
Практические советы по безопасности и производительности
- Всегда делайте резервные копии базы данных перед внедрением автоматического удаления данных.
- Ограничивайте удаление только статусами, которые точно не нужны (например,
cancelled,failed), чтобы не потерять важные данные. - Используйте WP-Cron с интервалом не чаще одного раза в сутки, чтобы не нагружать сервер.
- Для больших магазинов с тысячами заказов используйте пагинацию при выборке заказов, чтобы избежать превышения лимита памяти и таймаутов.
Сравнение способов автоматического удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин (например, WP Bulk Delete) | Простота настройки, UI | Может быть избыточным, нагрузка на БД при больших данных |
| Кастомный код и WP-Cron | Гибкость, минимальная нагрузка | Требует навыков, риск ошибок при некорректном коде |
| Ручное удаление через админку | Безопасно, контроль | Ручной труд, не подходит для больших объёмов |