Диагностика проблемы: зачем и когда нужно удалять заказы
В интернет-магазинах на WooCommerce с течением времени накапливается большое количество заказов в разных статусах: отменённые, неоплаченные, завершённые. Хранение неактуальных заказов негативно влияет на производительность базы данных и усложняет администрирование.
Задача: автоматизировать удаление заказов, которые находятся в определённых статусах и старше заданного периода. Например, автоматически удалять отменённые заказы старше 30 дней.
Шаг 1. Настройка WP-Cron для регулярной проверки заказов
Используем системный планировщик WordPress (WP-Cron) для запуска нашей функции раз в сутки. Добавьте в файл functions.php вашей темы или в плагин следующий код:
if ( ! wp_next_scheduled( 'wpcoder_delete_old_orders' ) ) {
wp_schedule_event( time(), 'daily', 'wpcoder_delete_old_orders' );
}
Этот код зарегистрирует ежедневное событие wpcoder_delete_old_orders.
Шаг 2. Создание функции удаления заказов
Добавим обработчик события, который будет искать заказы старше определённой даты и с нужным статусом, а затем удалять их.
add_action( 'wpcoder_delete_old_orders', 'wpcoder_delete_orders_by_status_and_age' );
function wpcoder_delete_orders_by_status_and_age() {
$days_old = 30; // количество дней для удаления
$statuses_to_delete = array( 'cancelled', 'failed', 'pending' ); // статусы для удаления
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_old} days" ) );
$args = array(
'limit' => -1,
'status' => $statuses_to_delete,
'date_created' => '<' . $date_threshold,
'return' => 'ids',
);
$orders = wc_get_orders( $args );
if ( empty( $orders ) ) {
return;
}
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true ); // принудительное удаление
}
}
Объяснение параметров:
limit => -1– получить все заказы без лимита.status– массив статусов для фильтрации.date_created– условие по дате создания заказа (старше 30 дней).return => 'ids'– вернуть только ID заказов для экономии памяти.
Шаг 3. Проверка результата
Чтобы проверить работу функции без ожидания, временно вызовите её вручную:
add_action( 'init', function() {
if ( current_user_can( 'manage_woocommerce' ) && isset( $_GET['test_delete_orders'] ) ) {
wpcoder_delete_orders_by_status_and_age();
echo 'Удаление выполнено';
exit;
}
});
После добавления этого кода в адресной строке сайта добавьте ?test_delete_orders=1 и обновите страницу. Если заказы подходящего возраста и статуса есть, они будут удалены. Убедитесь, что вы сделали резервную копию базы перед тестом.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, правильно ли указаны статусы и формат даты. Статусы должны соответствовать тем, что используются WooCommerce (например, cancelled, failed, pending).
- WP-Cron не срабатывает: по умолчанию WP-Cron запускается при заходе на сайт. Если трафик мал, запланированные задачи могут не запускаться вовремя. Для решения настройте системный cron на сервере для вызова
wp-cron.php. - Ошибка доступа: функция удаления привязана к событию, убедитесь, что код не вызывается в неподходящий момент (например, не вызывайте из фронтенда без проверки прав).
- Проблемы с производительностью: при большом числе заказов делайте удаление пакетами, чтобы не перегружать базу.
Практические советы по безопасности и производительности
- Обязательно делайте резервные копии базы перед автоматическим удалением.
- Для крупных магазинов разбивайте удаление на партии по 100-200 заказов с использованием пагинации.
- Используйте системный cron для более надёжного запуска задач (
crontabна Linux):wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1. - Добавьте логирование в файл, чтобы отслеживать, сколько заказов удалено и когда.
Сравнение методов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку WooCommerce | Простота, не требует кода | Трудозатратно при большом количестве |
| Плагин очистки заказов (например, WooCommerce Cleanup) | Готовые интерфейсы, автоматизация | Дополнительные плагины, нагрузка |
| Код на WP-Cron (описанный метод) | Полный контроль, без лишних плагинов, легко адаптировать | Требует навыков, настройка cron |