Диагностика задачи: зачем и когда нужно удалять заказы по статусу
В WooCommerce со временем в базе накапливаются заказы с различными статусами: отменённые, проваленные, ожидающие оплаты и т.д. Некоторые из них уже неактуальны и могут тормозить работу сайта и админки. Автоматическое удаление заказов по определённому статусу помогает поддерживать базу в порядке без лишних ручных действий.
Рассмотрим, как выявить необходимость автоматического удаления:
- В админке WooCommerce много заказов со статусом
cancelledилиfailed, которые не нужны для статистики. - Время хранения заказов ограничено внутренними регламентами или законодательством.
- Заказы с определённым статусом мешают производительности сайта и усложняют отчёты.
Пошаговое решение: как настроить автоматическое удаление заказов по статусу
1. Создаём функцию для удаления заказов в заданном статусе
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин, чтобы удалять заказы со статусом cancelled старше 30 дней:
function wpstart_delete_old_cancelled_orders() {
$days = 30; // возраст заказа в днях
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = array(
'status' => 'cancelled',
'limit' => -1,
'date_created' => '<' . $date,
'return' => 'ids',
);
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // принудительное удаление
}
}2. Добавляем задачу в планировщик WP-Cron
Чтобы удаление происходило регулярно, создадим событие, которое будет запускать функцию ежедневно:
function wpstart_schedule_delete_orders() {
if (!wp_next_scheduled('wpstart_daily_delete_cancelled_orders')) {
wp_schedule_event(time(), 'daily', 'wpstart_daily_delete_cancelled_orders');
}
}
add_action('wp', 'wpstart_schedule_delete_orders');
add_action('wpstart_daily_delete_cancelled_orders', 'wpstart_delete_old_cancelled_orders');3. Очистка планировщика при деактивации
Если вы используете кастомный плагин, не забудьте удалить задачу при его деактивации:
function wpstart_unschedule_delete_orders() {
$timestamp = wp_next_scheduled('wpstart_daily_delete_cancelled_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpstart_daily_delete_cancelled_orders');
}
}
register_deactivation_hook(__FILE__, 'wpstart_unschedule_delete_orders');Проверка результата после внедрения
- Проверьте наличие заказов со статусом
cancelled, старше 30 дней, в базе данных через phpMyAdmin или в админке WooCommerce - их должно стать меньше или они должны исчезнуть после срабатывания планировщика. - Для проверки запуска Cron можно временно вызвать функцию вручную в админке или через WP CLI:
wp eval 'wpstart_delete_old_cancelled_orders();' - Логи сервера и ошибок PHP не должны показывать ошибок, связанных с функцией удаления.
Частые ошибки и как их исправить
- Заказы не удаляются: возможно, WP-Cron не срабатывает из-за низкого трафика. Используйте внешний Cron или WP CLI для запуска задач.
- Удаляются не те заказы: перепроверьте параметр
'status'и условие даты. Для проверки используйтеwc_get_orders()с теми же аргументами отдельно. - Проблемы с производительностью при большом количестве заказов: добавьте ограничение по количеству заказов за один запуск, например,
'limit' => 50, и используйте повторный запуск. - Удаление не полное: функция
wp_delete_post($order_id, true)удаляет заказ полностью. Не используйтеfalseво втором параметре, иначе заказ попадёт в корзину.
Практические советы по безопасности и производительности
- Перед автоматическим удалением создавайте резервные копии базы данных, особенно если заказы важны для бухгалтерии.
- Для больших магазинов используйте WP CLI для запуска удаления, чтобы избежать таймаутов PHP.
- Регулярно проверяйте логи ошибок и планировщик задач, чтобы убедиться, что автоматизация работает корректно.
- Если нужно удалять заказы с другими статусами, расширьте функцию добавлением параметра или массива статусов.
Сравнение методов удаления заказов по статусу в WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Трудоёмко, риск пропустить старые заказы |
| Код с WP-Cron (автоматически) | Автоматизация, гибкость, не требует плагинов | Зависит от работы WP-Cron, требует навыков |
| Плагины для очистки заказов | Удобный интерфейс, часто с настройками | Может нагружать сайт, платные версии |