Почему важно удалять отменённые и отложенные заказы в WooCommerce
С течением времени в базе WooCommerce накапливаются заказы со статусами cancelled (отменён) и on-hold (отложен). Они не участвуют в продажах, но занимают место в базе данных, замедляют запросы и могут влиять на резервное копирование и производительность сайта. Автоматическое удаление таких заказов позволяет поддерживать базу в актуальном состоянии без необходимости ручной очистки.
Диагностика: как определить, что база нуждается в очистке
- Проверьте количество заказов с нужными статусами через SQL:
SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-on-hold') GROUP BY post_status;- Если количество отменённых и отложенных заказов превышает несколько тысяч, стоит задуматься об автоматизации очистки.
- Замедленная работа админки при просмотре заказов и отчётов — косвенный признак.
Пошаговое решение: код для автоматического удаления заказов по расписанию
Для автоматического удаления отменённых и отложенных заказов можно использовать WP-Cron и кастомную функцию. Ниже пример, который удаляет такие заказы старше 30 дней.
1. Добавление функции удаления заказов
function wpdebug_delete_old_cancelled_onhold_orders() {
$days = 30; // Возраст заказа в днях
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-cancelled', 'wc-on-hold'],
'date_query' => [
[
'before' => $date,
'inclusive' => true,
],
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — удалить без перемещения в корзину
}
}
}2. Регистрируем WP-Cron для запуска задачи раз в день
function wpdebug_schedule_order_cleanup() {
if (!wp_next_scheduled('wpdebug_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpdebug_daily_order_cleanup');
}
}
add_action('wp', 'wpdebug_schedule_order_cleanup');
add_action('wpdebug_daily_order_cleanup', 'wpdebug_delete_old_cancelled_onhold_orders');3. Очистка при деактивации плагина (если код в плагине)
function wpdebug_clear_order_cleanup_schedule() {
$timestamp = wp_next_scheduled('wpdebug_daily_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpdebug_daily_order_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wpdebug_clear_order_cleanup_schedule');Проверка результата после внедрения
- Запустите функцию вручную для теста, заменив
wpdebug_delete_old_cancelled_onhold_orders()вызовом из консоли WP-CLI или в файле темплейта. - Проверьте, что заказы со статусами
wc-cancelledиwc-on-holdстарше 30 дней действительно удалились. - Через 24 часа убедитесь, что WP-Cron сработал автоматически (логи или плагин WP Crontrol помогут).
- Проверьте производительность панели заказов и размер таблицы
wp_postsдо и после удаления.
Частые ошибки и их исправление
- Заказы не удаляются: убедитесь, что WP-Cron работает — иногда при низкой посещаемости сайта события не срабатывают. Проверьте плагин WP Crontrol.
- Удаляются нужные заказы: внимательно настройте параметры
post_statusиdate_query, чтобы не удалить активные или недавно созданные заказы. - Производительность падает при удалении большого количества заказов: разбейте удаление на партии с помощью пагинации в запросе, например, по 100 заказов за раз.
Практические советы по безопасности и производительности
- Резервное копирование: перед автоматическим удалением убедитесь, что регулярно делаете бэкапы базы данных.
- Логирование: добавьте запись в лог при каждом запуске функции, чтобы отслеживать удалённые заказы.
- Оптимизация запросов: при большом количестве заказов используйте WP_Query с пагинацией, чтобы избежать таймаутов.
- Использование плагинов: если не хотите писать код, рассмотрите Clearfy Pro (ссылка) — он умеет чистить базу и удалять неактивные данные.
Сравнение подходов удаления заказов
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Код с WP-Cron | Полный контроль, бесплатно, гибкая настройка | Требует навыков, зависит от WP-Cron | При желании кастомной логики, контроле над процессом |
| Плагин (например, Clearfy Pro) | Простота, готовый функционал, поддержка | Платно, меньше гибкости | Для быстрой настройки и поддержки без кода |
| Ручное удаление SQL-запросом | Мгновенно, без WP-Cron | Риск ошибок, требует бэкапа, нет автоматизации | Одноразовая чистка при больших объёмах |