Диагностика проблемы: зачем удалять старые заказы в WooCommerce
С ростом объёма продаж WooCommerce накапливает множество заказов с разным статусом — отменённые, завершённые, ожидающие оплаты и т.д. Старые отменённые и завершённые заказы занимают место в базе данных, замедляют бэкапы и могут создавать сложности при отчётности. Однако вручную удалять их неудобно и рискованно.
Основная задача — настроить автоматическое удаление заказов по статусу и возрасту, чтобы оптимизировать базу и поддерживать производительность сайта.
Как автоматически удалять заказы в WooCommerce по расписанию
1. Использование WP-Cron для регулярной очистки
WooCommerce не предоставляет встроенный механизм для удаления заказов, но мы можем написать кастомный код, который будет запускаться по расписанию с помощью WP-Cron.
2. Код для удаления заказов по статусу и возрасту
Ниже пример функции, которая удаляет заказы со статусом cancelled и completed, которым больше 30 дней.
function wpnews_delete_old_woocommerce_orders() {
$statuses_to_delete = array('cancelled', 'completed');
$days_old = 30;
$date = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));
foreach ($statuses_to_delete as $status) {
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-' . $status,
'date_query' => array(
array(
'before' => $date,
'inclusive' => true,
),
),
'posts_per_page' => 100,
'fields' => 'ids',
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true - удаление без отправки в корзину
}
}
}
}
function wpnews_schedule_order_cleanup() {
if (!wp_next_scheduled('wpnews_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpnews_daily_order_cleanup');
}
}
add_action('wpnews_daily_order_cleanup', 'wpnews_delete_old_woocommerce_orders');
add_action('wp', 'wpnews_schedule_order_cleanup');Пошаговое руководство по внедрению
- Добавьте код выше в файл
functions.phpвашей дочерней темы или в отдельный плагин. - Убедитесь, что WP-Cron работает корректно на вашем сайте (например, нет отключения real cron).
- Проверьте, что в базе есть заказы со статусом
cancelledиcompleted, которым больше 30 дней. - Дождитесь выполнения задачи (она запускается ежедневно) или выполните вручную через WP-CLI:
wp cron event run wpnews_daily_order_cleanup.
Как проверить, что удаление сработало
- В админке WooCommerce перейдите в «Заказы» и отфильтруйте по статусам
ОтменёниЗавершён. Заказы старше 30 дней должны отсутствовать. - Используйте SQL-запрос для проверки в базе:
— результат должен быть 0 или близок к нему.SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-completed') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY); - Проверьте логи сервера или WP-DEBUG, если задача не сработала.
Частые ошибки и как их исправить
- WP-Cron не запускается автоматически: хостинг может блокировать WP-Cron. Решение — настроить системный cron на вызов
wp-cron.phpили запускать задачу вручную через WP-CLI. - Заказы не удаляются: проверьте права пользователя, от имени которого запускается код, и убедитесь, что функция
wp_delete_postвызывается с параметромtrueдля удаления без корзины. - Удаляются не те заказы: проверьте, что в запросе
post_statusуказан корректно с префиксомwc-.
Практические советы по безопасности и производительности
- Не удаляйте заказы моложе 30 дней — дайте время на возможное восстановление или анализ.
- Если заказов очень много, ограничьте количество удаляемых за раз (
posts_per_page) и запускайте задачу чаще, чтобы не перегружать базу. - Резервное копирование базы перед внедрением автоматического удаления обязательно.
- Для больших сайтов лучше использовать системный cron вместо WP-Cron для надежности.
Сравнение методов удаления заказов в WooCommerce
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление через админку | Просто, без кода | Затратно по времени, риск ошибок | Мало заказов |
| WP-Cron с пользовательским кодом | Автоматизация, гибкость | Зависит от WP-Cron, требует настройки | Средние и крупные магазины |
| Системный cron + WP-CLI | Надежно, быстро | Требует доступа к серверу и навыков | Большие сайты с нагрузкой |
| Плагины для очистки заказов | Готовое решение, интерфейс | Могут быть избыточными, влиять на производительность | Быстрое внедрение без кода |