Диагностика проблемы: почему нужно удалять отменённые и завершённые заказы
Магазины на WooCommerce со временем накапливают большое количество заказов в статусах "отменён" и "завершён". Это приводит к росту размера базы данных, увеличению времени отклика запросов и, как следствие, замедлению работы сайта и панели администратора. Стандартных настроек для автоматического удаления заказов по дате в WooCommerce нет, а использование сторонних плагинов может привести к конфликтам и избыточной нагрузке.
Решение — реализовать автоматическое удаление заказов с помощью кастомного кода, который будет запускаться по расписанию через WP-Cron.
Пошаговое решение: реализация автоматического удаления заказов по статусу и дате
1. Создание функции удаления заказов
Добавим функцию, которая будет выбирать заказы со статусами "cancelled" и "completed", старше указанного количества дней, и удалять их.
function wpcore_delete_old_wc_orders() {
$days = 30; // количество дней для хранения заказов
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-cancelled', 'wc-completed'],
'date_query' => [
[
'column' => 'post_date',
'before' => $date,
],
],
'posts_per_page' => 100,
'fields' => 'ids',
'no_found_rows' => true,
];
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $order_id) {
wp_delete_post($order_id, true); // true — без возможности восстановления
}
}
}2. Регистрация WP-Cron задачи для регулярного запуска
Добавим ежедневный крон-задачу, которая будет вызывать функцию удаления.
function wpcore_schedule_order_cleanup() {
if (!wp_next_scheduled('wpcore_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpcore_daily_order_cleanup');
}
}
add_action('wp', 'wpcore_schedule_order_cleanup');
add_action('wpcore_daily_order_cleanup', 'wpcore_delete_old_wc_orders');3. Отмена крон-задачи при деактивации темы или плагина
function wpcore_clear_order_cleanup_schedule() {
$timestamp = wp_next_scheduled('wpcore_daily_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpcore_daily_order_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wpcore_clear_order_cleanup_schedule');Проверка результата после внедрения
- Подключитесь к базе данных через phpMyAdmin или любой другой клиент и выполните запрос для проверки количества заказов с нужными статусами, созданных более 30 дней назад:
SELECT ID, post_date, post_status FROM wp_posts
WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-completed')
AND post_date < NOW() - INTERVAL 30 DAY;- После первого запуска WP-Cron (например, обновите любой URL сайта для запуска событий) повторите запрос — заказы старше 30 дней должны исчезнуть.
- В административной панели WooCommerce в разделе "Заказы" проверьте, что старые заказы удалены.
- Для отладки можно временно добавить запись логов в функцию удаления.
Частые ошибки и как их исправить
- Крон-задача не запускается: убедитесь, что на сайте есть активный трафик, так как WP-Cron зависит от посещений. Для теста запустите функцию вручную через админку или wp-cli.
- Удаление не происходит: проверьте, что статусы заказов указаны правильно: WooCommerce добавляет префикс
wc-. В запросе WP_Query должны бытьwc-cancelledиwc-completed. - Заказы не удаляются полностью: функция
wp_delete_postс параметромtrueудаляет запись и метаданные без возможности восстановления. Если параметр не указан, заказы попадают в корзину. - Ошибка из-за ограничения памяти или времени выполнения: уменьшите количество заказов на партию в
posts_per_pageили настройте лимиты PHP.
Практические советы по безопасности и производительности
- Для больших баз данных используйте пакетную обработку, например, удаляйте заказы частями по 50-100 штук за раз.
- Храните резервные копии базы перед внедрением автоматического удаления — это поможет восстановить данные при ошибках.
- Избегайте запуска крона слишком часто — достаточно один раз в сутки.
- Если сайт с большой нагрузкой, рассмотрите возможность переноса задачи на серверный cron, отключив WP-Cron (define('DISABLE_WP_CRON', true);) и настроив системный cron.
- Регулярно очищайте не только заказы, но и связанные с ними метаданные и транзиенты для уменьшения размера БД.
Сравнение вариантов удаления заказов
| Метод | Плюсы | Минусы | Примеры кода/плагинов |
|---|---|---|---|
| Кастомный код с WP-Cron | Максимальный контроль, легковесность, без сторонних плагинов | Нужно настраивать и тестировать самостоятельно | Как в статье выше |
| Плагины очистки заказов | Упрощённая настройка, готовый функционал | Могут конфликтовать, нагрузка, не всегда обновляются | Advanced Order Cleanup, WooCommerce Order Cleaner |
| Ручное удаление через админку | Простота | Трудоёмко, риск забыть, не автоматизировано | - |