Диагностика задачи: зачем и когда удалять старые заказы в WooCommerce
В интернет-магазинах на WooCommerce с течением времени накапливается большое количество заказов, в том числе завершённых, отменённых или отложенных. Это увеличивает размер базы данных и может замедлять работу сайта, особенно при большом трафике и использовании отчётов. Автоматическое удаление старых заказов по определённому статусу помогает поддерживать базу в оптимальном состоянии, снижая нагрузку и упрощая администрирование.
Шаг 1. Определяем критерии для удаления заказов
Для автоматического удаления нам понадобится:
- Выбрать статус заказа (например,
completedилиcancelled). - Установить порог по времени, например, удалять заказы старше 90 дней.
Важно: удаление происходит без возврата, поэтому желательно делать резервные копии базы данных перед внедрением.
Шаг 2. Реализация автоматического удаления заказов с помощью wp-cron
Создадим функцию, которая будет запускаться по расписанию и удалять заказы по заданным параметрам.
Регистрация события wp-cron
if ( ! wp_next_scheduled( 'wpstuff_delete_old_orders' ) ) {
wp_schedule_event( time(), 'daily', 'wpstuff_delete_old_orders' );
}Функция удаления заказов
add_action( 'wpstuff_delete_old_orders', 'wpstuff_delete_orders_by_status_and_date' );
function wpstuff_delete_orders_by_status_and_date() {
$status = 'completed'; // Статус заказов для удаления
$days = 90; // Возраст заказа в днях
$date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-' . $status,
'date_query' => array(
array(
'before' => $date,
'inclusive' => true,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
foreach ( $query->posts as $order_id ) {
wp_delete_post( $order_id, true );
}
}
}Шаг 3. Очистка и проверка результата
После добавления кода в functions.php темы или в собственный плагин, можно вручную запустить задачу для проверки, например, через WP-CLI:
wp cron event run wpstuff_delete_old_ordersИли временно вызвать функцию напрямую:
add_action( 'init', function() {
if ( current_user_can( 'manage_woocommerce' ) ) {
wpstuff_delete_orders_by_status_and_date();
}
} );Проверяем в админке WooCommerce — старые заказы выбранного статуса должны исчезнуть.
Чек-лист для проверки правильности работы
- Код добавлен без синтаксических ошибок.
- В базе есть заказы с нужным статусом и датой старше установленного порога.
- Задача wp-cron зарегистрирована (проверить через
wp cron event listили плагин WP Crontrol). - После запуска функция удаляет заказы.
- Резервная копия базы перед тестами сделана.
Частые ошибки и их исправление
Заказы не удаляются
- Неправильно указан статус заказа. В WooCommerce статусы имеют префикс
wc-. Например,wc-completed. - Отсутствует событие wp-cron или оно не запускается. Проверить через WP Crontrol.
- Используется кэширование, из-за которого запрос не актуален.
Удаляются не те заказы или слишком много
- Неправильно задан параметр даты в
date_query. - Используется
posts_per_pageбольше допустимого — при большом количестве заказов лучше делать удаление пакетами.
Практические советы по безопасности и производительности
- Запускайте удаление в ночное время с низкой нагрузкой.
- Делайте удаление партиями по 100–200 заказов, чтобы не перегрузить сервер.
- Используйте транзакции базы данных при сложных операциях.
- Перед удалением учитывайте связанные данные — например, платежные данные, мета-поля и т. д.
- Регулярно создавайте резервные копии базы данных.
Сравнение способов реализации автоматического удаления заказов
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Самописный код + wp-cron | Гибкость, контроль, без сторонних плагинов | Требует навыков, возможны ошибки в запросах | Проверять на тестовом сайте |
| Плагины очистки базы (например, WP Rocket, Clearfy) | Простота, готовая функциональность | Могут удалять лишнее, нагрузка на сервер | Использовать с осторожностью, тестировать |
| Удаление вручную в админке WooCommerce | Простота, контроль | Требуется время, не автоматично | Использовать для мелких магазинов |