Диагностика задачи: зачем и когда удалять заказы автоматически
В магазинах на WooCommerce со временем накапливаются заказы с разными статусами — отменённые, просроченные, ожидающие оплаты. Они не нужны в активной базе, тормозят работу, занимают место в базе данных и могут мешать аналитике. Автоматическое удаление таких заказов по заданному статусу и времени помогает поддерживать базу в чистоте без ручного контроля.
Типичные сценарии:
- Удаление отменённых заказов старше 30 дней;
- Удаление заказов со статусом "ожидает оплаты", которые висят более недели;
- Очистка тестовых заказов после завершения тестирования.
Пошаговое решение: настройка автоматического удаления заказов через WP-Cron
1. Создайте функцию для удаления заказов по статусу и времени
Ниже пример кода, который находит и удаляет заказы с указанным статусом старше заданного количества дней:
function wpfind_delete_old_orders( $status = 'cancelled', $days = 30 ) {
if ( ! class_exists( 'WC_Order_Query' ) ) {
return;
}
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$query = new WC_Order_Query( array(
'limit' => -1,
'status' => $status,
'date_modified' => '<' . $date_threshold,
'return' => 'ids',
) );
$order_ids = $query->get_orders();
foreach ( $order_ids as $order_id ) {
wp_delete_post( $order_id, true );
}
}2. Зарегистрируйте WP-Cron событие для периодического запуска
Добавьте хук и функцию планировщика, чтобы запускать очистку ежедневно:
function wpfind_schedule_order_cleanup() {
if ( ! wp_next_scheduled( 'wpfind_daily_order_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wpfind_daily_order_cleanup' );
}
}
add_action( 'wp', 'wpfind_schedule_order_cleanup' );
add_action( 'wpfind_daily_order_cleanup', function() {
// Удаляем отменённые заказы старше 30 дней
wpfind_delete_old_orders( 'cancelled', 30 );
// Удаляем заказы в ожидании оплаты старше 7 дней
wpfind_delete_old_orders( 'pending', 7 );
});3. Разместите код в functions.php вашей дочерней темы или в отдельном плагине
Чтобы изменения не потерялись при обновлении, лучше использовать дочернюю тему или собственный плагин. Не размещайте код в основной теме напрямую.
Проверка результата после внедрения
Чтобы убедиться, что очистка работает:
- Создайте тестовые заказы с нужным статусом и датой изменения старше заданного порога (можно через базу или программно).
- Запустите событие WP-Cron вручную (например, с помощью плагина WP Crontrol) или дождитесь автоматического запуска.
- Проверьте, что заказы удалились (их больше нет в админке WooCommerce и в базе wp_posts).
- Посмотрите логи ошибок сервера и WordPress, чтобы убедиться, что нет сбоев.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, активен ли WP-Cron и правильно ли зарегистрировано событие. Включите плагин WP Crontrol для диагностики.
- Удаляются не те заказы: Проверьте аргументы
WC_Order_Query, особенно статус и дату. Используйте var_dump для отладки выборки. - Большая нагрузка на сервер при удалении: Если заказов много, делайте удаление партиями, добавив лимит в запрос и повторяя процесс.
- Удаление не происходит из-за прав: Убедитесь, что WordPress имеет права на удаление постов, а пользователь с нужными правами (обычно admin) выполняет задачу.
Практические советы по безопасности и производительности
- Перед удалением рекомендуется создавать резервные копии базы данных.
- Удаляйте заказы только с тем статусом, который точно не нужен — лучше не удалять статус "завершён" или "обрабатывается".
- Для больших магазинов используйте пакетное удаление, например, по 50 заказов за раз, чтобы не перегружать базу и сервер.
- Используйте
wp_delete_post( $order_id, true )с параметромtrueдля полного удаления из базы, а не в корзину. - Для мониторинга запуска WP-Cron можно добавить логирование в файл, например:
add_action( 'wpfind_daily_order_cleanup', function() {
error_log( 'Запуск очистки заказов: ' . date( 'Y-m-d H:i:s' ) );
wpfind_delete_old_orders( 'cancelled', 30 );
wpfind_delete_old_orders( 'pending', 7 );
});Сравнение вариантов решения задачи
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Трудоёмко, не автоматизировано | Маленькие магазины, редкие удаления |
| Плагин для очистки базы | Удобный интерфейс, автоматизация | Зависимость от плагина, возможны конфликты | Средние магазины, без опыта программирования |
| Код на WP-Cron (предложенный) | Гибкость, контроль, легковесность | Нужно программировать и тестировать | Большие магазины, требующие точной настройки |