Почему важно автоматически удалять старые заказы в WooCommerce
С течением времени база WooCommerce может разрастаться за счёт большого количества заказов, включая отменённые и просроченные. Это негативно сказывается на производительности сайта, особенно при большом трафике и объёмах данных. Автоматическое удаление заказов по заданному сроку помогает освободить место в базе данных, ускорить админ-панель и снизить нагрузку на сервер.
Диагностика: как понять, что старые заказы замедляют WooCommerce
- В панели WordPress админка заказов грузится медленно или подвисает.
- Увеличенный размер таблиц
wp_postsиwp_postmetaиз-за большого количества записей типаshop_order. - Высокая нагрузка на базу данных при запросах к заказам.
- Замедленная генерация отчетов и статистики.
Для проверки количества заказов в базе можно выполнить SQL-запрос через phpMyAdmin или плагин Query Monitor:
SELECT post_status, COUNT(*) AS count FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Если количество отменённых и завершённых заказов насчитывает десятки тысяч, стоит задуматься об их очистке.
Пошаговое решение: настройка автоматического удаления заказов старше N дней
1. Создаём WP-Cron задачу
Добавим в functions.php вашей темы или в кастомный плагин следующий код для регистрации задачи, которая будет запускаться ежедневно:
function wpgen_schedule_delete_old_orders() {
if ( ! wp_next_scheduled( 'wpgen_delete_old_woocommerce_orders_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wpgen_delete_old_woocommerce_orders_hook' );
}
}
add_action( 'wp', 'wpgen_schedule_delete_old_orders' );2. Функция удаления заказов
Добавим обработчик события, который будет удалять заказы старше 30 дней со статусом cancelled или failed:
add_action( 'wpgen_delete_old_woocommerce_orders_hook', 'wpgen_delete_old_orders' );
function wpgen_delete_old_orders() {
$days_to_keep = 30; // количество дней хранения заказов
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_to_keep} days" ) );
$args = array(
'post_type' => 'shop_order',
'post_status' => array( 'wc-cancelled', 'wc-failed' ),
'date_query' => array(
array(
'before' => $date_threshold,
'inclusive' => true,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
'no_found_rows' => true,
);
$old_orders = get_posts( $args );
if ( empty( $old_orders ) ) {
return;
}
foreach ( $old_orders as $order_id ) {
wp_delete_post( $order_id, true ); // true — удаление без корзины
}
}3. Очистка и тестирование
Для запуска задачи вручную можно использовать плагин WP Crontrol или выполнить напрямую:
do_action( 'wpgen_delete_old_woocommerce_orders_hook' );После запуска проверьте, что старые заказы действительно удалились из базы.
Проверка результата
- Через админ-панель WooCommerce обновите список заказов и убедитесь, что отменённые и неактивные заказы старше 30 дней отсутствуют.
- Повторите SQL-запрос, чтобы увидеть уменьшение количества заказов со статусами
wc-cancelledиwc-failed. - Проверьте логи сервера на отсутствие ошибок удаления.
Частые ошибки и как их исправить
- Задача WP-Cron не запускается — проверьте, что на сайте есть реальный трафик или настройте системный cron на сервере для запуска
wp-cron.php. Без этого задачи не будут выполняться вовремя. - Заказы не удаляются, хотя условие подходит — убедитесь, что статусы заказов указаны правильно (например,
wc-cancelledвместо простоcancelled). - Удаление приводит к ошибкам или зависаниям — попробуйте разбить удаление на порции, например, 50 заказов за раз, чтобы снизить нагрузку.
Практические советы по безопасности и производительности
- Удаляйте заказы только с нужными статусами, чтобы не потерять важные данные.
- Резервируйте базу данных перед внедрением автоматического удаления.
- Для больших магазинов используйте WP-CLI скрипты для очистки, чтобы избежать таймаутов HTTP.
- Ограничьте количество удаляемых заказов за раз, чтобы не перегружать сервер.
- Используйте плагин Clearfy Pro для оптимизации базы и удаления мусорных данных без потери важных записей: https://wpshop.ru/plugins/clearfy
Сравнение методов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron с кастомным кодом | Гибкость, не требует плагинов, можно настроить логику | Зависимость от трафика, возможны таймауты при большом объёме |
| Плагины очистки заказов | Простота установки, интерфейс, часто есть расписание | Могут быть тяжелыми, не всегда гибкие |
| WP-CLI скрипты | Очень быстрые, можно запускать вручную или по cron | Требуют доступа к серверу, навыков работы с консолью |