Диагностика проблемы: зачем нужно удалять просроченные заказы
В WooCommerce просроченные (заброшенные) заказы, например со статусом pending или failed, со временем накапливаются и занимают место в базе данных. Это замедляет работу сайта и усложняет управление заказами. Автоматическое удаление таких заказов помогает поддерживать базу в чистоте, но важно учитывать, что удаление должно быть безопасным и не привести к потере нужных данных.
Как проверить наличие просроченных заказов
Чтобы оценить проблему, выполните SQL-запрос через phpMyAdmin или WP CLI:
SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') ORDER BY post_date ASC;
Так вы увидите список заказов с указанными статусами, отсортированных по дате создания.
Пошаговое решение: скрипт автоматического удаления просроченных заказов с подтверждением
1. Определяем критерии удаления
- Статус заказа:
wc-pending,wc-failed - Возраст заказа: старше 7 дней (можно настроить)
2. Создаем функцию удаления
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wpdemo_delete_expired_orders() {
$args = array(
'status' => array('pending', 'failed'),
'date_created' => '<' . ( time() - 7 * DAY_IN_SECONDS ),
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders( $args );
if ( empty( $orders ) ) {
return 'No expired orders found.';
}
foreach ( $orders as $order_id ) {
$order = wc_get_order( $order_id );
if ( $order ) {
$order->delete( true ); // true — удалить навсегда
}
}
return count( $orders ) . ' expired orders deleted.';
}
3. Создаем консольную команду для ручного вызова с подтверждением
Если на сайте есть WP-CLI, добавьте команду для безопасного запуска:
if ( defined('WP_CLI') && WP_CLI ) {
WP_CLI::add_command('wpdemo-delete-orders', function() {
WP_CLI::confirm('Вы уверены, что хотите удалить все просроченные заказы?');
$result = wpdemo_delete_expired_orders();
WP_CLI::success($result);
});
}
4. Настраиваем автоматический запуск через WP-Cron
Добавьте задачу для ежедневного удаления (например, в 3:00 ночи):
function wpdemo_schedule_order_cleanup() {
if ( ! wp_next_scheduled( 'wpdemo_cleanup_expired_orders_hook' ) ) {
wp_schedule_event( strtotime('03:00:00'), 'daily', 'wpdemo_cleanup_expired_orders_hook' );
}
}
add_action( 'wp', 'wpdemo_schedule_order_cleanup' );
add_action( 'wpdemo_cleanup_expired_orders_hook', 'wpdemo_delete_expired_orders' );
Проверка результата после внедрения
- Запустите команду в WP-CLI:
wp wpdemo-delete-orders
Вы увидите запрос подтверждения и сообщение об удалении. - Проверьте базу данных на наличие просроченных заказов через SQL-запрос (см. выше).
- Просмотрите логи WP-Cron, чтобы убедиться, что запланированная задача выполняется.
Частые ошибки и как их исправить
- Удаление не происходит: проверьте, активен ли WP-Cron на сайте или запускайте cron вручную через сервер.
- Удаляются нужные заказы: убедитесь, что критерии выбора заказов корректны (проверьте статус и дату).
- Ошибка при удалении из-за зависимостей: используйте метод
$order->delete(true)для принудительного удаления. - Команда WP-CLI не работает: проверьте, установлен ли WP-CLI и доступна ли команда на сервере.
Практические советы по безопасности и производительности
- Перед автоматическим удалением создайте резервную копию базы данных.
- Для сайтов с большим количеством заказов добавьте лимит удаления за один проход и запускайте скрипт несколько раз.
- Используйте отдельный плагин для удаления, чтобы не потерять код при смене темы.
- Для повышения производительности можно отключить ненужные хуки во время массового удаления.
- Включите логирование удалений для аудита и отладки.
Сравнение вариантов удаления просроченных заказов
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Ручное удаление через WP-CLI | Полный контроль, подтверждение действий | Требует доступа к серверу и знания WP-CLI | Средние и крупные сайты |
| Автоматический WP-Cron скрипт | Автоматизация, регулярное очищение | Зависит от стабильности WP-Cron, риск удаления без подтверждения | Малые и средние сайты с надежным WP-Cron |
| Плагины очистки заказов | Простота настройки, интерфейс | Дополнительная нагрузка, возможные конфликты | Начинающие пользователи |