Диагностика проблемы: зачем удалять заказы автоматически
В WooCommerce накапливается большое количество заказов с различными статусами, включая отменённые, отклонённые или просроченные неоплаченные заказы. Это замедляет работу админки, увеличивает размер базы данных и затрудняет отчёты. Ручное удаление неудобно и требует времени.
Чтобы оценить текущую ситуацию, выполните SQL-запрос к базе данных через phpMyAdmin или WP-CLI:
SELECT post_status, COUNT(ID) as count FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Так вы увидите распределение заказов по статусам. Если заказы с определёнными статусами (например, 'wc-cancelled', 'wc-failed') копятся и не нужны, можно их автоматизировать для удаления.
Пошаговое решение: скрипт автоматического удаления заказов
1. Создаём функцию для удаления заказов по статусу и дате
Добавьте следующий код в файл functions.php вашей дочерней темы или создайте собственный плагин для удобства поддержки:
function wpdir_delete_old_orders() {
$statuses_to_delete = array('wc-cancelled', 'wc-failed'); // Статусы заказов для удаления
$date_threshold = date('Y-m-d H:i:s', strtotime('-30 days')); // Удалять заказы старше 30 дней
$args = array(
'post_type' => 'shop_order',
'post_status' => $statuses_to_delete,
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date_threshold,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
if (empty($orders)) {
return;
}
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Полное удаление
}
}2. Запускаем функцию по расписанию через WP-Cron
Добавьте планировщик задач для автоматического запуска функции раз в сутки:
if (!wp_next_scheduled('wpdir_daily_delete_old_orders')) {
wp_schedule_event(time(), 'daily', 'wpdir_daily_delete_old_orders');
}
add_action('wpdir_daily_delete_old_orders', 'wpdir_delete_old_orders');3. Очистка WP-Cron (при необходимости)
Если вы меняете параметры или тестируете, можно сбросить событие:
$timestamp = wp_next_scheduled('wpdir_daily_delete_old_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpdir_daily_delete_old_orders');
}Проверка результата после внедрения
- Проверьте наличие заказов с указанными статусами и датой старше 30 дней до запуска скрипта.
- Запустите функцию вручную, вызвав
wpdir_delete_old_orders()через WP-CLI или временно через админку. - Проверьте, что заказы удалены из базы
wp_postsи связанных таблиц (например,wp_postmeta). - Через сутки убедитесь, что WP-Cron сработал — в логах сервера или с помощью плагина WP Crontrol.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что статусы указаны правильно с префиксом
wc-(например,wc-cancelled), иначе get_posts не найдёт заказов. - Скрипт удаляет лишние заказы: Убедитесь, что фильтр по дате корректен, чтобы не удалять свежие заказы.
- WP-Cron не запускается автоматически: Поскольку WP-Cron зависит от посещений сайта, для надёжности настраивайте системный cron на вызов
wp-cron.phpили запускайте вручную. - Производительность: Если заказов много, удаляйте порциями, чтобы не перегружать сервер.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы перед автоматическим удалением.
- Для больших магазинов используйте пакетную обработку с лимитом, например
posts_per_page = 50, чтобы избежать таймаутов. - Удаление заказов влияет на отчёты и статистику — учитывайте это в бизнес-процессах.
- Для надёжности логируйте ID удалённых заказов в файл или системный лог.
Сравнение вариантов удаления заказов
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Плагин (например, WP Bulk Delete) | Простота настройки, интерфейс | Зависимость от стороннего кода, нагрузка | Для администраторов без навыков программирования |
| Кастомный скрипт с WP-Cron | Гибкость, контроль, оптимизация под задачи | Требует знаний PHP и WordPress API | Для разработчиков и больших проектов |
| Ручное удаление через базу или админку | Простота без автоматизации | Трудоёмко, риск ошибок | В редких случаях, при небольшом количестве заказов |