Диагностика задачи: зачем и когда нужно удалять заказы автоматически
В интернет-магазинах на WooCommerce зачастую накапливается большое количество заказов в статусах, которые уже не актуальны: отложенные, отменённые или просроченные неоплаченные заказы. Это приводит к разрастанию базы данных, снижению производительности и усложнению администрирования. Автоматическое удаление таких заказов помогает держать базу в чистоте и улучшать скорость работы сайта.
Подготовка к автоматическому удалению заказов
Прежде чем внедрять автоматическое удаление, убедитесь в следующем:
- Вы понимаете, какие статусы заказов нужно удалять (например,
cancelled,failed,pending). - Вы уверены, что удаление заказов не нарушит бухгалтерию или отчетность.
- Сделали резервную копию базы данных на случай ошибок.
Пошаговое решение: PHP-скрипт с использованием WP-Cron для удаления заказов по статусу и дате
Для автоматизации используем WP-Cron — встроенный планировщик WordPress. В примере ниже удаляем заказы со статусом cancelled старше 30 дней.
<?php
// 1. Регистрируем задачу планировщика
add_action('wp', function() {
if (!wp_next_scheduled('wc_delete_old_cancelled_orders')) {
wp_schedule_event(time(), 'daily', 'wc_delete_old_cancelled_orders');
}
});
// 2. Функция удаления заказов
add_action('wc_delete_old_cancelled_orders', function() {
$days = 30; // сколько дней считать "старыми"
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'post_type' => 'shop_order',
'post_status' => 'wc-cancelled',
'date_query' => [
[
'column' => 'post_date',
'before' => $date_threshold,
]
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$orders = get_posts($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — удаление без восстановления
}
});
// 3. Очистка при деактивации темы или плагина
register_deactivation_hook(__FILE__, function() {
wp_clear_scheduled_hook('wc_delete_old_cancelled_orders');
});
?>Объяснение: скрипт регистрирует ежедневную задачу, которая ищет заказы со статусом cancelled, созданные более 30 дней назад, и удаляет их.
Как изменить статус или период
- Для другого статуса замените
'post_status' => 'wc-cancelled'на нужный, например'wc-failed'или'wc-pending'. - Период меняется в переменной
$days.
Проверка результата после внедрения
Чтобы проверить, что скрипт работает:
- Создайте тестовый заказ в нужном статусе с датой старше пороговой.
- Принудительно запустите Cron-задачу через плагин WP Crontrol или вручную вызвав хук:
do_action('wc_delete_old_cancelled_orders');3. Проверьте, что заказ удалён в админке WooCommerce.
4. Для автоматической проверки смотрите в wp_cron логи или используйте плагин WP Crontrol, чтобы убедиться, что событие запланировано и выполняется.
Частые ошибки и их исправление
- Заказы не удаляются
Причина: WP-Cron не срабатывает на сайте без трафика. Решение: настройте системный cron на сервере или используйте плагин WP Crontrol для принудительного запуска. - Удаляются не те заказы
Причина: неверно указан статус или период в запросе.
Проверьте правильностьpost_statusи формат даты. - Производительность страдает при большом количестве заказов
Решение: добавьте постраничную обработку, например, удалять по 100 заказов за один запуск.
Практические советы по безопасности и производительности
- Всегда делайте резервные копии перед удалением данных.
- Удаляйте заказы только с проверенными статусами, чтобы не потерять важную информацию.
- Используйте
wp_delete_post($order_id, true)с флагомtrue, чтобы полностью удалить заказ, а не отправлять в корзину. - Для крупных магазинов используйте пакетную обработку заказов (по 50-100 штук за раз), чтобы избежать таймаутов.
- Мониторьте логи ошибок сервера и WordPress для выявления сбоев в работе cron-задач.
Таблица сравнения вариантов удаления заказов
| Метод | Плюсы | Минусы | Подходит для |
|---|---|---|---|
| Ручное удаление через админку | Просто, без кода | Трудозатратно при большом количестве | Маленькие магазины |
| Плагин (например, WP Bulk Delete) | Удобство, графический интерфейс | Дополнительные зависимости, нагрузка | Средние магазины |
| Автоматический скрипт на WP-Cron | Автоматизация, гибкость | Требует навыков программирования | Средние и крупные магазины |