Диагностика задачи: зачем и когда нужно удалять заказы автоматически
В интернет-магазинах на WooCommerce часто накапливается множество старых заказов, особенно если они в статусах "отменён", "в ожидании оплаты" или "черновик". Это влияет на нагрузку базы данных и замедляет административную панель. Автоматическое удаление таких заказов по времени помогает поддерживать чистоту данных без использования тяжёлых плагинов.
Как определить, какие заказы подлежат удалению
Для автоматизации важно чётко определить критерии отбора:
- Статусы заказов: например, "cancelled", "failed" или "pending"
- Возраст заказа: например, старше 30 дней
- Дополнительные условия (опционально): отсутствие оплаты, отсутствие связи с пользователем и т.п.
Пошаговое решение: автоматизация удаления заказов через WP-Cron и WP_Query
Реализуем функцию, которая будет еженощно запускаться и удалять заказы с нужными параметрами.
1. Регистрируем событие WP-Cron
add_action('wp', function() {
if (!wp_next_scheduled('wpteam_woocommerce_clean_old_orders')) {
wp_schedule_event(time(), 'daily', 'wpteam_woocommerce_clean_old_orders');
}
});2. Добавляем функцию удаления заказов
add_action('wpteam_woocommerce_clean_old_orders', function() {
$days = 30; // удаляем заказы старше 30 дней
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-cancelled', 'wc-failed', 'wc-pending'],
'date_query' => [
[
'column' => 'post_date',
'before' => $date_threshold,
]
],
'posts_per_page' => 100, // лимит на один проход
'fields' => 'ids',
];
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $order_id) {
wp_delete_post($order_id, true); // принудительное удаление
}
}
wp_reset_postdata();
});3. Проверяем и удаляем крон-задачу при деактивации темы или плагина
register_deactivation_hook(__FILE__, function() {
$timestamp = wp_next_scheduled('wpteam_woocommerce_clean_old_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpteam_woocommerce_clean_old_orders');
}
});Проверка результата после внедрения
Чтобы убедиться, что удаление работает:
- Запустите вручную событие через
do_action('wpteam_woocommerce_clean_old_orders');в functions.php или через консоль WP-CLI. - Проверьте в админке WooCommerce заказы с нужным статусом и датой — они должны исчезнуть.
- Отслеживайте логи сервера или создайте логирование в функции удаления для контроля.
Частые ошибки и как их исправить
- Не удаляются заказы: проверьте правильность статусов — WooCommerce использует "wc-" префиксы.
- Функция не запускается по расписанию: убедитесь, что WP-Cron работает (проверить через плагин WP Crontrol).
- Удаление не полное: используйте
wp_delete_post($order_id, true);для принудительного удаления, иначе заказ может попасть в корзину. - Высокая нагрузка при большом количестве заказов: уменьшите
posts_per_pageи настройте повторный запуск через несколько минут.
Практические советы по безопасности и производительности
- Не используйте слишком частый запуск задачи — достаточно 1 раз в сутки.
- Перед удалением можно делать резервную копию базы или экспорт заказов.
- Для больших магазинов лучше делать удаление порциями с постепенным увеличением даты.
- Логируйте действия в отдельный файл, чтобы быстро выявлять ошибки.
Сравнение способов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагины очистки заказов | Простота установки, дополнительные настройки | Нагрузка, дополнительный вес, возможные конфликты |
| Код на WP-Cron (пример выше) | Лёгкий, контролируемый, без лишних плагинов | Требует навыков разработки и тестирования |
| Ручное удаление через админку | Простота и безопасность | Трудозатратно, не автоматизировано |