Почему важно удалять отменённые и отложенные заказы в WooCommerce
Магазины на WooCommerce с большим потоком заказов часто сталкиваются с проблемой роста базы данных за счёт множества отменённых и отложенных заказов. Такие записи не только занимают место, но и замедляют работу административной панели, отчётов и бэкапов. Автоматизация очистки этих заказов снижает нагрузку и улучшает производительность.
Диагностика проблемы: как определить, что база данных перегружена старыми заказами
Для начала проверьте количество заказов с статусами cancelled, failed и on-hold. Это можно сделать через SQL-запрос к таблице wp_posts (замените префикс wp_ на ваш):
SELECT post_status, COUNT(*) AS count FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-failed', 'wc-on-hold') GROUP BY post_status;Если число заказов с такими статусами превышает несколько тысяч, стоит задуматься об их очистке.
Пошаговое решение: автоматическое удаление старых отменённых и отложенных заказов с помощью WP-Cron
Создадим функцию, которая будет запускаться раз в сутки и удалять заказы старше определённого количества дней с выбранными статусами.
1. Добавление функции удаления заказов
function wpdebug_delete_old_wc_orders() {
if ( ! class_exists( 'WooCommerce' ) ) {
return; // WooCommerce не активен
}
$statuses_to_delete = array( 'wc-cancelled', 'wc-failed', 'wc-on-hold' );
$days_old = 30; // удалять заказы старше 30 дней
$args = array(
'post_type' => 'shop_order',
'post_status' => $statuses_to_delete,
'date_query' => array(
array(
'column' => 'post_date',
'before' => "$days_old days ago",
),
),
'posts_per_page' => -1,
'fields' => 'ids',
'no_found_rows' => true,
);
$orders = get_posts( $args );
if ( empty( $orders ) ) {
return;
}
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true ); // принудительное удаление
}
}2. Регистрация события WP-Cron для запуска функции ежедневно
add_action( 'wpdebug_daily_cleanup', 'wpdebug_delete_old_wc_orders' );
function wpdebug_schedule_daily_cleanup() {
if ( ! wp_next_scheduled( 'wpdebug_daily_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wpdebug_daily_cleanup' );
}
}
add_action( 'wp', 'wpdebug_schedule_daily_cleanup' );3. Запуск задачи вручную для проверки
Для проверки работы функции можно вызвать её вручную через админку или WP-CLI:
wp eval 'wpdebug_delete_old_wc_orders();'Как проверить, что автоматическое удаление работает
- Через базу данных повторите SQL запрос из раздела диагностики — количество старых заказов должно уменьшиться.
- Включите логирование в WordPress и добавьте внутри функции
error_logс количеством удалённых заказов. - Проверьте, что событие WP-Cron запланировано с помощью плагина WP Crontrol или команды WP-CLI
wp cron event list.
Частые ошибки и как их исправить
- Функция не запускается автоматически: WP-Cron работает только при посещениях сайта. Для надёжности настройте системный cron на сервере, вызывающий WP-Cron через
wgetилиcurl. - Удаляются не те заказы или не удаляются вовсе: Проверьте правильность статусов заказа — WooCommerce добавляет префикс
wc-к статусам в базе. - Потеря данных: Убедитесь, что удаляете только действительно ненужные заказы, задавая корректный промежуток по дате.
- Проблемы с производительностью при большом количестве заказов: Вместо
posts_per_page = -1используйте пагинацию и удаляйте партиями.
Практические советы по безопасности и производительности
- Добавьте nonce и проверки прав, если хотите расширять функционал для запуска из админки.
- Для крупных магазинов используйте WP-CLI-скрипты с пакетной обработкой заказов, чтобы избежать таймаутов.
- Перед удалением всегда делайте резервную копию базы данных.
- Используйте плагин Clearfy Pro для оптимизации базы и дополнительной чистки данных (https://wpshop.ru/plugins/clearfy?utm_source=wpdebug.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udaleniye-otmenennyh-i-zamedlennyh-zakazov).
Сравнение способов удаления старых заказов WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота, нет кода | Долго, риск пропуска |
| WP-Cron с кастомной функцией | Автоматизация, гибкость параметров | Зависимость от посещений сайта, требует кода |
| WP-CLI скрипты | Быстро, подходит для больших сайтов | Требует доступа к серверу, навыков Shell |
| Плагины оптимизации (например, Clearfy Pro) | Удобно, дополнительные функции очистки | Платные, может влиять на производительность |