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