Диагностика проблемы с накоплением заказов в WooCommerce
Магазины на WooCommerce с большим трафиком и объемом заказов часто сталкиваются с замедлением работы сайта из-за большого количества старых заказов в базе данных. Закрытые и неактивные заказы — это заказы, которые уже не нужны для текущих процессов, но остаются в базе, вызывая рост размера таблиц и замедление запросов.
Чтобы убедиться, что именно эти заказы влияют на производительность, проверьте таблицу wp_posts с типом shop_order и статусами заказов. Особенно это актуально для статусов cancelled, failed, refunded и completed с датой старше нескольких месяцев.
Как автоматически удалять старые закрытые и неактивные заказы в WooCommerce
Что считать неактивным заказом
Под неактивными понимаются заказы, которые имеют статус cancelled, failed или refunded и были созданы более 30 дней назад. Также можно добавить completed заказы старше 1 года, если для бизнеса не требуется хранить историю.
Пошаговое решение через добавление кода в functions.php или в кастомный плагин
Добавим функцию, которая будет запускаться через WP-Cron ежедневно и удалять заказы по условиям.
function wc_delete_old_inactive_orders() {
if ( ! class_exists( 'WC_Order_Query' ) ) {
return;
}
$statuses_to_delete = array( 'cancelled', 'failed', 'refunded' );
$date_query = array(
'column' => 'post_date',
'before' => date('Y-m-d', strtotime('-30 days')),
);
$orders = wc_get_orders( array(
'status' => $statuses_to_delete,
'date_created' => $date_query,
'limit' => -1,
'return' => 'ids',
) );
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
}
// Регистрируем ежедневное событие, если еще не зарегистрировано
if ( ! wp_next_scheduled( 'wc_daily_delete_old_orders' ) ) {
wp_schedule_event( time(), 'daily', 'wc_daily_delete_old_orders' );
}
// Привязываем функцию к событию
add_action( 'wc_daily_delete_old_orders', 'wc_delete_old_inactive_orders' );Этот код удалит навсегда (второй параметр true в wp_delete_post) заказы со статусами cancelled, failed и refunded старше 30 дней.
Удаление старых заказов со статусом completed
Если нужно удалить completed заказы старше 1 года, добавьте дополнительный вызов:
function wc_delete_old_completed_orders() {
$date_query = array(
'column' => 'post_date',
'before' => date('Y-m-d', strtotime('-1 year')),
);
$orders = wc_get_orders( array(
'status' => 'completed',
'date_created' => $date_query,
'limit' => -1,
'return' => 'ids',
) );
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
}
add_action( 'wc_daily_delete_old_orders', 'wc_delete_old_completed_orders' );Проверка результата после внедрения
Чтобы проверить, что удаление сработало, выполните SQL-запрос к базе:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-failed', 'wc-refunded') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);Число заказов должно уменьшиться после запуска крона. Также можно увидеть логи работы крона через плагин WP Crontrol или отладить вызов функции вручную.
Частые ошибки и как их исправить
- Функция не вызывается: Проверьте, что событие wp_cron действительно запускается (например, активируйте плагин WP Crontrol и убедитесь, что задача запланирована).
- Статусы заказов указаны без префикса wc-: В WooCommerce статусы хранятся с префиксом, например
wc-cancelled. При использованииwc_get_ordersдостаточно указывать безwc-, но для SQL-запросов обязательно с префиксом. - Удаление не происходит из-за прав: Код должен выполняться с правами администратора, убедитесь, что нет ограничений по ролям.
- Удаление приводит к ошибкам: Не используйте массовое удаление при большом количестве заказов без ограничения по партиям, иначе может быть превышен лимит памяти или время выполнения.
Практические советы по безопасности и производительности
- Перед удалением сделайте резервную копию базы данных.
- Если заказов много, разбивайте удаление на партии по 100-200 заказов за раз, чтобы избежать таймаутов. Например, добавьте параметр
'limit' => 100и используйте пагинацию. - Отключите удаление заказов, если в магазине идет акция или период отчетности.
- Логируйте удаленные заказы в отдельный файл или таблицу, чтобы можно было восстановить данные при необходимости.
- Для оптимизации работы используйте плагин Clearfy Pro от WPShop (https://wpshop.ru/plugins/clearfy?utm_source=wp-ai.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udalenie-zakrytyh-i-neaktivnyh-zakazov-cherez-kod), который имеет встроенные инструменты очистки и оптимизации WooCommerce.
Сравнение методов удаления заказов
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Ручное удаление через админку | Простота, нет кода | Трудозатратно, не подходит для больших объемов | WooCommerce - Заказы - выбор и удаление |
| Плагин очистки WooCommerce | Автоматизация, удобство | Может быть платным, лишние функции | Clearfy Pro, WP-Optimize |
| Код в functions.php с wp_cron | Полный контроль, бесплатно, гибкость | Нужно писать код, возможны ошибки | Код из статьи выше |