Диагностика проблемы: зачем удалять заказы автоматически
В интернет-магазинах на WooCommerce со временем накапливаются заказы, которые находятся в статусах "в ожидании оплаты", "отменён", "на обработке" очень долго или просто неактивны. Это нагружает базу данных, замедляет работу административной панели и усложняет отчёты.
Автоматическое удаление неактивных заказов помогает поддерживать базу в оптимальном состоянии, снижает нагрузку на хостинг и улучшает удобство работы с актуальными заказами.
Как определить неактивные заказы для удаления
Часто критерии следующие:
- Статусы:
pending,failed,cancelled,refunded - Время с момента создания: больше 30 или 60 дней
- Отсутствие оплаты и движения по заказу
Перед автоматическим удалением важно убедиться, что заказы действительно неактивны и не нужны для отчетности.
Пошаговое решение: код для удаления неактивных заказов по расписанию
Добавим в functions.php или в кастомный плагин следующий код для регулярной очистки заказов.
<?php
// 1. Создаём cron задачу при активации темы/плагина
function wpdir_schedule_delete_old_orders() {
if ( ! wp_next_scheduled( 'wpdir_delete_old_orders_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wpdir_delete_old_orders_hook' );
}
}
add_action( 'wp', 'wpdir_schedule_delete_old_orders' );
// 2. Функция удаления
function wpdir_delete_old_orders() {
$statuses = array( 'pending', 'failed', 'cancelled' );
$days_old = 30; // удалять заказы старше 30 дней
$date_query = array(
'column' => 'post_date',
'before' => date('Y-m-d H:i:s', strtotime("-{$days_old} days")),
);
$args = array(
'status' => $statuses,
'limit' => -1,
'date_created' => $date_query,
'return' => 'ids',
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order_id ) {
wp_trash_post( $order_id ); // можно заменить на wp_delete_post для окончательного удаления
}
}
// 3. Привязываем функцию к крону
add_action( 'wpdir_delete_old_orders_hook', 'wpdir_delete_old_orders' );
// 4. Очищаем cron при деактивации темы/плагина
function wpdir_clear_schedule_delete_old_orders() {
$timestamp = wp_next_scheduled( 'wpdir_delete_old_orders_hook' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpdir_delete_old_orders_hook' );
}
}
register_deactivation_hook( __FILE__, 'wpdir_clear_schedule_delete_old_orders' );
?>Код создаёт ежедневное событие, которое удаляет заказы с указанными статусами старше 30 дней. Удаление происходит через перемещение в корзину — если хотите удалить окончательно, используйте wp_delete_post.
Как проверить, что удаление работает
- В админке WooCommerce перейдите в раздел заказов и отфильтруйте по статусам
pending,failed,cancelled. Запишите количество заказов старше 30 дней. - Запустите вручную функцию удаления через WP-CLI:
wp eval 'wpdir_delete_old_orders();'или временно добавьте вызов функции вfunctions.php. - Проверьте, что старая часть заказов переместилась в корзину или удалена.
- Для отладки можно добавить логирование в функцию удаления:
function wpdir_delete_old_orders() {
$statuses = array( 'pending', 'failed', 'cancelled' );
$days_old = 30;
$date_query = array(
'column' => 'post_date',
'before' => date('Y-m-d H:i:s', strtotime("-{$days_old} days")),
);
$args = array(
'status' => $statuses,
'limit' => -1,
'date_created' => $date_query,
'return' => 'ids',
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order_id ) {
error_log("Удаление заказа #" . $order_id);
wp_trash_post( $order_id );
}
}
Частые ошибки и как их исправить
- Функция не вызывается по расписанию: Проверьте, что WP-Cron работает (например, активен ли трафик на сайте). Для стабильной работы лучше настроить системный cron, вызывающий
wp-cron.php.
Команда для системного cron:wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1 - Заказы не удаляются: проверьте права пользователя, под которым запускается WP. Также убедитесь, что в статусах заказа вы указали правильные ключи (например,
cancelled, а неcancel). - Удаление удаляет нужные заказы: перед удалением добавьте логи и проверьте выборку. Лучше сначала перемещать в корзину, а не удалять сразу.
Практические советы по безопасности и производительности
- Не удаляйте заказы, которые могут понадобиться для аудита или бухгалтерии — уточните политику хранения данных.
- Если база очень большая, разбивайте удаление на партии (например, по 50 заказов за раз), чтобы избежать тайм-аутов.
- Используйте WP-CLI для запуска удаления вручную или по крону для надежности.
- Регулярно делайте бэкапы базы, особенно перед внедрением автоматического удаления.
Сравнение способов удаления заказов
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Удаление через wp_trash_post | Можно восстановить, безопасно | Заказы остаются в корзине и могут занимать место | Очищать корзину вручную или по крону |
| Удаление через wp_delete_post | Полное удаление, освобождает место | Невозможно восстановить, риск потери данных | Использовать с осторожностью, после тестов |
| Плагины для очистки базы | Удобство, готовые решения | Могут быть избыточными или не подходить под критерии | Комбинировать с кастомным кодом |