Почему стоит настраивать автоматическое удаление заказов по статусу в WooCommerce?
В магазинах на WooCommerce со временем накапливаются заказы с различными статусами: отменённые, отклонённые, ожидающие оплаты и т.д. Если не очищать такие заказы, база данных разрастается, что может замедлить работу сайта и усложнить управление заказами.
Автоматическое удаление заказов с определённым статусом помогает поддерживать базу в порядке и снижать нагрузку на сервер.
Диагностика: как понять, что накопилось много лишних заказов?
- Проверьте количество заказов по статусам в WooCommerce → Заказы → Фильтры по статусу.
- Подключитесь к базе данных через phpMyAdmin и выполните запрос:
SELECT post_status, COUNT(ID) as total FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Если количество заказов с статусом wc-cancelled, wc-failed или wc-pending значительно превышает активные, имеет смысл настроить автоматическое удаление.
Пошаговое решение: реализуем автоматическое удаление заказов по статусу
1. Создаём функцию удаления заказов
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wpstart_delete_orders_by_status( $status = 'wc-cancelled', $days_old = 30 ) {
$args = array(
'post_type' => 'shop_order',
'post_status' => $status,
'date_query' => array(
array(
'column' => 'post_date',
'before' => "$days_old days ago",
),
),
'fields' => 'ids',
'posts_per_page' => -1,
);
$orders = get_posts( $args );
if ( empty( $orders ) ) {
return 0;
}
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
return count( $orders );
}2. Настраиваем запуск через WP-Cron
Добавим планировщик, который будет запускать удаление раз в неделю:
// Регистрация события при активации темы или плагина
function wpstart_schedule_order_cleanup() {
if ( ! wp_next_scheduled( 'wpstart_weekly_order_cleanup' ) ) {
wp_schedule_event( time(), 'weekly', 'wpstart_weekly_order_cleanup' );
}
}
add_action( 'wp', 'wpstart_schedule_order_cleanup' );
// Хук для выполнения очистки
add_action( 'wpstart_weekly_order_cleanup', function() {
$deleted = wpstart_delete_orders_by_status( 'wc-cancelled', 30 ); // Удаляем отменённые заказы старше 30 дней
error_log( "WooCommerce: удалено заказов со статусом wc-cancelled - $deleted" );
});Проверка результата после внедрения
- Посмотрите логи PHP (error_log), чтобы убедиться, что функция запускается и удаляет заказы.
- Перейдите в WooCommerce → Заказы и проверьте, что заказы с указанным статусом и датой старше 30 дней действительно отсутствуют.
- Можно временно изменить период удаления (например, на 1 день), чтобы быстро проверить работу.
Частые ошибки и как их исправить
- Отсутствие запланированного события WP-Cron: убедитесь, что на сайте работают WP-Cron события (не отключены в wp-config.php). Для отладки можно использовать плагин WP Crontrol.
- Неправильный статус заказа: статусы WooCommerce всегда начинаются с
wc-. Проверяйте точное имя статуса через админку или базу данных. - Удаление не происходит: возможно, недостаточно прав у PHP процесса или функция
wp_delete_postне вызывается. Проверьте ошибки в логе.
Практические советы по безопасности и производительности
- Удаление заказов происходит с принудительным удалением (
wp_delete_post($id, true)), что убирает запись из базы полностью. Убедитесь, что данные резервируются, если нужны для отчётов. - Для сайтов с большим количеством заказов лучше разбивать удаление на части (например, по 100 заказов за раз), чтобы избежать таймаутов.
- Используйте плагин Clearfy Pro для дополнительной оптимизации базы и удаления устаревших данных, если хотите упростить управление.
Сравнение способов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку WooCommerce | Просто, не требует кода | Нужно много времени при большом объёме заказов |
| WP-Cron + пользовательский код (описанный способ) | Автоматизация, гибкость настройки | Требует базовых навыков разработки |
| Плагины для оптимизации базы (например, Clearfy Pro) | Интегрированное решение, дополнительные инструменты | Платные решения, может быть избыточно |