Диагностика проблемы: зачем удалять заказы в WooCommerce
Со временем база данных WooCommerce может разрастаться за счёт большого количества заказов в статусах отменён и завершён. Это влияет на производительность административной панели, замедляет запросы к базе и может создавать неудобства при работе с отчётами и экспортом.
Убедитесь, что в вашем магазине действительно есть большое количество таких заказов. Для диагностики выполните SQL-запрос к базе данных или используйте WP CLI:
wp wc order list --status=cancelled --format=count
wp wc order list --status=completed --format=countЕсли число заказов превышает несколько тысяч, имеет смысл автоматизировать их периодическое удаление.
Пошаговое решение: как настроить автоматическое удаление заказов
1. Создаём функцию для удаления заказов по статусу
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
function wp24_delete_old_orders_by_status( $status, $days = 30 ) {
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$args = [
'limit' => -1,
'status' => $status,
'date_created' => '<' . $date_threshold,
'return' => 'ids',
];
$orders = wc_get_orders( $args );
if ( empty( $orders ) ) {
return 0;
}
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true ); // Полное удаление
}
return count( $orders );
}2. Создаём крон-задачу для регулярного запуска
Добавьте регулярное задание, которое будет запускать удаление заказов старше 30 дней:
if ( ! wp_next_scheduled( 'wp24_schedule_delete_old_orders' ) ) {
wp_schedule_event( time(), 'daily', 'wp24_schedule_delete_old_orders' );
}
add_action( 'wp24_schedule_delete_old_orders', function() {
$deleted_cancelled = wp24_delete_old_orders_by_status( 'cancelled', 30 );
$deleted_completed = wp24_delete_old_orders_by_status( 'completed', 30 );
error_log( "Удалено отменённых заказов: {$deleted_cancelled}, завершённых заказов: {$deleted_completed}" );
});3. Проверяем работу крона
Для проверки работы задачи:
- Включите WP_DEBUG_LOG, чтобы увидеть логи удаления в
wp-content/debug.log. - Для теста можно временно запустить действие вручную:
do_action( 'wp24_schedule_delete_old_orders' );Проверка результата после внедрения
После выполнения крона проверьте следующие показатели:
- Количество заказов с нужными статусами в админке должно уменьшиться.
- В файле
debug.logпоявится запись об удалённых заказах. - Производительность работы с заказами в админке улучшится.
Для точного подсчёта используйте WP CLI:
wp wc order list --status=cancelled --format=count
wp wc order list --status=completed --format=countЧастые ошибки и как их исправить
1. Задача не запускается
Причина: WP-Cron может не запускаться автоматически, если на сайте низкий трафик.
Решение: настроить системный cron для вызова wp-cron.php. Например, добавьте в crontab:
* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&12. Удаление не происходит
Причина: некорректный статус заказа или неправильный формат даты.
Решение: проверьте, что статусы передаются точно как cancelled и completed. Для дебага добавьте вывод количества найденных заказов перед удалением.
3. Заказы не удаляются полностью
Причина: вызов wp_delete_post с параметром false (корзина), а не полное удаление.
Решение: используйте wp_delete_post( $order_id, true ) для полного удаления.
Практические советы по безопасности и производительности
- Перед автоматическим удалением сделайте резервную копию базы данных, чтобы можно было восстановить данные.
- Не удаляйте заказы младше 30 дней, чтобы сохранить нужные данные для отчетности и поддержки клиентов.
- Если на сайте много заказов, лимитируйте удаление партиями, чтобы избежать перегрузки сервера. Например, по 100 заказов за раз.
- Используйте WP-CLI для ручного массового удаления, если крон не подходит.
Сравнение способов удаления заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админку | Простота, не требует кода | Неэффективно при большом количестве заказов |
| Автоматизация через WP-Cron и код (как в статье) | Автоматическое, без плагинов, гибко | Требует базовых знаний PHP, настройка крона |
| Плагины для очистки WooCommerce | Удобный интерфейс, дополнительные функции | Дополнительная нагрузка, возможные конфликты |