Диагностика задачи: зачем и когда нужно удалять заказы в WooCommerce
В стандартном WooCommerce заказы не удаляются автоматически, что приводит к накоплению большого объема данных в базе. Это замедляет работу административной панели и увеличивает размер базы данных. Особенно это актуально при большом количестве тестовых, отменённых или завершённых заказов.
Часто пользователи хотят избавиться от заказов старше определённого времени и с определёнными статусами, например, удалить отменённые заказы старше 30 дней.
Пошаговое решение: автоматическое удаление заказов по дате и статусу
1. Создание WP-Cron задачи
Лучший способ автоматизировать удаление — использовать WP-Cron, который будет запускать функцию очистки по расписанию.
if ( ! wp_next_scheduled( 'wpcoder_delete_old_orders_event' ) ) {
wp_schedule_event( time(), 'daily', 'wpcoder_delete_old_orders_event' );
}
2. Функция удаления заказов
Напишем функцию, которая выбирает заказы с нужными статусами и датой старше N дней, а затем удаляет их.
function wpcoder_delete_old_orders() {
$days = 30; // Время хранения заказов
$statuses = array('cancelled', 'failed'); // Статусы для удаления
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$args = array(
'post_type' => 'shop_order',
'post_status' => array_map(function($status) { return 'wc-' . $status; }, $statuses),
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date_threshold,
),
),
'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 — безвозвратно
}
}
}
add_action( 'wpcoder_delete_old_orders_event', 'wpcoder_delete_old_orders' );
Проверка результата после внедрения
Чтобы проверить, что удаление работает:
- В админке WooCommerce зайдите в раздел заказов и отфильтруйте по статусам
cancelledиfailed. - Проверьте даты заказов — удалите вручную несколько старых для теста и запустите WP-Cron вручную (через WP-CLI или плагин WP Crontrol).
- Проверьте, что эти заказы исчезли из базы.
Запуск WP-Cron вручную через WP-CLI:
wp cron event run wpcoder_delete_old_orders_event
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что WP-Cron действительно работает. В некоторых случаях хостинг блокирует WP-Cron, тогда нужно настроить системный cron.
- Удаляются не те заказы: Убедитесь, что статусы заказов указаны правильно с префиксом
wc-, например,wc-cancelled. - Удаление занимает много времени: Ограничьте количество заказов для удаления за один запуск, добавьте пагинацию.
- Потеря важных данных: Сделайте резервную копию базы перед внедрением.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post( $order_id, true )только если уверены, что заказы действительно не нужны. Альтернативно можно использоватьfalseдля перемещения в корзину с возможностью восстановления. - Для больших баз данных разбивайте удаление на части, например, по 100 заказов за один запуск, чтобы избежать таймаутов.
- Регулярно оптимизируйте таблицы базы данных с помощью плагинов или SQL-команд
OPTIMIZE TABLE wp_postsиOPTIMIZE TABLE wp_postmeta. - Если хотите более гибкое управление, рассмотрите плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpcoder.ru&utm_medium=article&utm_campaign=woocommerce-udalit-zakazy-po-vozrastu-i-statusu) — там есть инструменты для очистки базы WooCommerce.
Альтернативы: плагин или код?
| Метод | Плюсы | Минусы | Когда выбрать |
|---|---|---|---|
| Код на PHP с WP-Cron | Гибкость, легковесность, полный контроль | Требует навыков программирования, возможность ошибок | Если нужен кастомный фильтр и автоматизация без сторонних плагинов |
| Плагины очистки WooCommerce | Простота настройки, поддержка, дополнительные функции | Нагрузка на сайт, зависимость от обновлений | Если нужно быстро, без кода, или комплексное управление базой |