Диагностика проблемы: зачем удалять заказы по статусу
В WooCommerce иногда возникает необходимость автоматически удалять заказы, которые находятся в определённом статусе, например, "отменён", "отклонён" или "в ожидании оплаты" долгое время. Это помогает поддерживать чистоту базы данных, улучшает производительность и упрощает работу с отчётами.
Если вы замечаете, что база заказов растёт без контроля и содержит множество неактивных, устаревших или тестовых заказов, это снижает скорость работы админки, увеличивает размер резервных копий и может создавать путаницу.
Как проверить, что проблема действительно есть
- Перейдите в WooCommerce → Заказы и проверьте количество заказов с нужным статусом (например, отменённые).
- Откройте базу данных через phpMyAdmin и выполните запрос по таблице
wp_postsс условиемpost_type = 'shop_order'иpost_status = 'wc-cancelled'(или другой нужный статус). - Проанализируйте, сколько таких заказов старше определённого срока (например, 30 дней).
Пошаговое решение: автоматическое удаление заказов по статусу
1. Создаём функцию удаления заказов
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин для безопасности и удобства поддержки:
function wpreboot_delete_orders_by_status() {
if ( ! current_user_can( 'manage_woocommerce' ) ) {
return;
}
$status = 'wc-cancelled'; // замените на нужный статус заказа
$days_old = 30; // удалять заказы старше 30 дней
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_old} days" ) );
$args = array(
'status' => $status,
'date_created' => '<' . $date_threshold,
'limit' => -1,
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
$order->delete( true ); // true - принудительное удаление
}
}2. Автоматизация через WP-Cron
Чтобы функция работала автоматически, добавим задачу в планировщик WordPress:
function wpreboot_schedule_order_deletion() {
if ( ! wp_next_scheduled( 'wpreboot_delete_orders_daily' ) ) {
wp_schedule_event( time(), 'daily', 'wpreboot_delete_orders_daily' );
}
}
add_action( 'wp', 'wpreboot_schedule_order_deletion' );
add_action( 'wpreboot_delete_orders_daily', 'wpreboot_delete_orders_by_status' );Этот код запустит удаление заказов с указанным статусом и старше 30 дней ежедневно.
Проверка результата после внедрения
- Перейдите в WooCommerce → Заказы и проверьте, что заказы с указанным статусом и возрастом старше 30 дней удалены.
- В phpMyAdmin выполните SQL-запрос:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);- Результат должен быть 0 (если удаление прошло успешно).
- Проверьте логи сервера на наличие ошибок при выполнении WP-Cron.
Частые ошибки и как их исправить
- Функция не запускается автоматически: Проверьте, работает ли WP-Cron на вашем хостинге. Иногда его отключают. Для теста можно вручную вызвать функцию
wpreboot_delete_orders_by_status()через админский интерфейс или WP-CLI. - Права доступа: Убедитесь, что код проверяет
current_user_can('manage_woocommerce'), чтобы избежать удаления заказов случайно. - Удаляются не те заказы: Проверьте правильность указанного статуса заказа: WooCommerce использует префикс
wc-перед статусами (например,wc-completed,wc-cancelled). - Большая нагрузка при удалении: Если заказов много, удаляйте их партиями, например, по 50 штук за один запуск, чтобы не вызвать таймауты.
Практические советы по безопасности и производительности
- Резервное копирование: Перед автоматическим удалением убедитесь, что у вас есть свежая резервная копия базы данных.
- Логирование: Добавьте логирование действий удаления в отдельный файл или в системный лог для аудита.
- Пакетное удаление: Для больших магазинов используйте пагинацию в запросах, чтобы не нагружать сервер:
$limit = 50;
$page = 1;
do {
$args = array(
'status' => $status,
'date_created' => '<' . $date_threshold,
'limit' => $limit,
'paged' => $page,
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
$order->delete( true );
}
$page++;
} while ( count( $orders ) === $limit );Сравнение методов удаления заказов
| Метод | Плюсы | Минусы | Применение |
|---|---|---|---|
| Ручное удаление через админку | Просто, без кода | Трудоёмко при большом объёме заказов | Маленькие магазины |
| WP-CLI команды | Быстро и мощно | Требует доступа к серверу | Администраторы с доступом к SSH |
| Автоматизация через WP-Cron и PHP | Автоматически поддерживает базу в порядке | Нужно контролировать работу WP-Cron | Средние и крупные магазины |