Диагностика проблемы: зачем удалять старые заказы в WooCommerce
WooCommerce по умолчанию не удаляет старые заказы из базы данных, что приводит к увеличению объема базы, замедлению работы админки и росту нагрузки на сервер. Особенно это критично для магазинов с большим количеством заказов. Регулярное удаление устаревших заказов помогает поддерживать производительность и экономить ресурсы.
Настройка WP-Cron для автоматического удаления старых заказов
Что такое WP-Cron и почему он нужен
WP-Cron — это встроенный планировщик задач WordPress, позволяющий запускать функции в заданное время или по расписанию. Использовать WP-Cron удобно для периодических задач, например, для очистки базы.
Пошаговое решение
Добавляем кастомную функцию для удаления заказов старше N дней. Для примера — удалим заказы старше 90 дней:
function wppuzzle_delete_old_orders() { $days = 90; $date = date('Y-m-d H:i:s', strtotime("-{$days} days")); $args = [ 'limit' => -1, 'status' => ['completed', 'cancelled', 'failed', 'refunded'], 'date_created' => '<' . $date, 'return' => 'ids', ]; $orders = wc_get_orders($args); foreach ($orders as $order_id) { wp_trash_post($order_id); // перемещаем в корзину // Для полного удаления используйте wp_delete_post($order_id, true); } }Создаем событие WP-Cron, запускающее эту функцию раз в сутки:
function wppuzzle_schedule_old_orders_cleanup() { if (!wp_next_scheduled('wppuzzle_cleanup_event')) { wp_schedule_event(time(), 'daily', 'wppuzzle_cleanup_event'); } } add_action('wp', 'wppuzzle_schedule_old_orders_cleanup'); add_action('wppuzzle_cleanup_event', 'wppuzzle_delete_old_orders');Добавляем очистку при деактивации плагина или темы, чтобы избежать мусора в WP-Cron:
function wppuzzle_cleanup_cron() { $timestamp = wp_next_scheduled('wppuzzle_cleanup_event'); if ($timestamp) { wp_unschedule_event($timestamp, 'wppuzzle_cleanup_event'); } } register_deactivation_hook(__FILE__, 'wppuzzle_cleanup_cron');
Проверка результата после внедрения
- Проверьте наличие запланированного события через WP-CLI командой
wp cron event list— в списке должен бытьwppuzzle_cleanup_eventс периодом daily. - Выполните вручную хук для теста:
и проверьте, что старые заказы перемещены в корзину или удалены.do_action('wppuzzle_cleanup_event'); - Посмотрите в админке WooCommerce → Заказы, старые заказы должны исчезнуть или перейти в корзину.
Частые ошибки и их исправление
- WP-Cron не запускается: обычно происходит на сайтах с низким трафиком, так как WP-Cron запускается при загрузке страниц. Решение — настроить системный cron на хостинге, который обращается к wp-cron.php. Пример для Linux:
* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1- Удаляются не все заказы: проверьте фильтр статусов в
wc_get_orders. По умолчанию заказы в статусе 'pending' или 'processing' не удаляются. - Удаление не происходит полностью: функция
wp_trash_post()только перемещает заказ в корзину. Для полного удаления используйтеwp_delete_post($order_id, true);— будьте осторожны, это необратимо.
Практические советы по безопасности и производительности
- Ограничьте удаление заказов только статусами, которые гарантированно не нужны для отчетности.
- В больших магазинах удаляйте заказы порциями (например, по 100 заказов в одном запуске), чтобы избежать превышения лимита памяти и времени выполнения.
- Резервируйте базу перед внедрением автоматического удаления.
- Используйте WP-Cron совместно с системным cron для стабильности.
Сравнение способов удаления старых заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота, без кода | Трудоемко, не автоматизировано |
| WP-Cron + кастомный код | Автоматично, гибко, без плагинов | Зависит от WP-Cron, требует навыков разработки |
| Плагины для очистки WooCommerce | Удобно, настройки в UI | Дополнительный вес, возможные конфликты |