Почему важно удалять старые неоплаченные заказы в WooCommerce
С течением времени в базе WooCommerce накапливаются неоплаченные заказы. Они занимают место, замедляют работу административной панели и влияют на отчёты. Ручное удаление — затратная и ошибкоопасная процедура. Автоматизация удаления поможет поддерживать базу в порядке, не теряя важных данных по оплачиваемым заказам.
Как диагностировать проблему с накоплением неоплаченных заказов
Для начала стоит проверить, сколько неоплаченных заказов хранится в базе и как они распределены по времени:
global $wpdb;
$days = 30; // количество дней
$orders_count = $wpdb->get_var( $wpdb->prepare(
"SELECT COUNT(*) FROM {$wpdb->prefix}posts
WHERE post_type = 'shop_order'
AND post_status = 'wc-pending'
AND post_date < NOW() - INTERVAL %d DAY",
$days
));
echo "Неоплаченных заказов старше $days дней: $orders_count";Если число большое (сотни или тысячи), стоит задуматься об автоматизации очистки.
Пошаговое решение: автоматическое удаление старых неоплаченных заказов через WP-Cron
1. Добавляем функцию удаления заказов
function wprus_delete_old_unpaid_orders() {
$days = 30; // удалять заказы старше 30 дней
$args = array(
'status' => 'pending',
'date_created' => '<' . ( new WC_DateTime() )->modify( "-{$days} days" )->date( 'Y-m-d H:i:s' ),
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order_id ) {
wp_trash_post( $order_id ); // перемещаем заказ в корзину (безопаснее, чем полностью удалять)
}
}2. Регистрируем ежедневное событие WP Cron
function wprus_schedule_order_cleanup() {
if ( ! wp_next_scheduled( 'wprus_daily_order_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wprus_daily_order_cleanup' );
}
}
add_action( 'wp', 'wprus_schedule_order_cleanup' );
add_action( 'wprus_daily_order_cleanup', 'wprus_delete_old_unpaid_orders' );3. Как проверить, что задача работает
- В админке WordPress установите плагин WP Crontrol (https://ru.wordpress.org/plugins/wp-crontrol/), чтобы увидеть запланированные задачи.
- Проверьте, что событие
wprus_daily_order_cleanupзапланировано и выполняется. - Посмотрите базу заказов или используйте SQL-запрос, чтобы убедиться, что старые неоплаченные заказы перемещаются в корзину.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, активен ли WP-Cron (на некоторых серверах он отключён). Для теста вызовите функцию
wprus_delete_old_unpaid_orders()вручную. - Удаляются оплаченные заказы: Убедитесь, что в параметрах запроса указан статус
pending, а неprocessingилиcompleted. - Заказы не попадают в корзину, а удаляются сразу: Используйте
wp_trash_post()вместоwp_delete_post()для безопасного удаления с возможностью восстановления.
Практические советы по безопасности и производительности
- Не удаляйте заказы сразу, а перемещайте в корзину. Это позволит восстановить данные при ошибках.
- Ограничьте количество удаляемых заказов за один запуск, если база очень большая, чтобы не перегружать сервер.
- Если WP-Cron не работает, настройте системный cron или вызовите
wp-cron.phpчерез планировщик сервера.
Таблица сравнения вариантов удаления старых неоплаченных заказов
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудозатратно, риск ошибок | Подходит для мелких магазинов |
| Автоматизация через WP-Cron и код | Полный контроль, гибкость | Требует знаний, настройка cron | Оптимально для средних и крупных магазинов |
| Плагины очистки заказов (например, WooCommerce Order Cleaner) | Удобно, готовое решение | Зависимость от стороннего кода, может быть избыточным | Использовать при отсутствии желания писать код |