Диагностика проблемы: почему заказы не удаляются автоматически
WooCommerce не имеет встроенного механизма для автоматического удаления отключённых (cancelled) и неоплаченных (pending, failed) заказов. Со временем база данных накапливает большое количество таких заказов, что замедляет работу сайта и усложняет администрирование. Если вы заметили, что вручную удалять заказы неудобно и плагинов для этого недостаточно, пора переходить к автоматизации через код.
Пошаговое решение: как автоматически удалять отключённые и неоплаченные заказы
1. Создаём функцию для удаления заказов по статусам
Основная идея — запускать WP-Cron задачу, которая раз в сутки удалит все заказы со статусами cancelled, pending и failed старше определённого количества дней.
function wpscan_delete_old_wc_orders() {
// Устанавливаем количество дней для хранения заказов
$days_to_keep = 30;
$date_before = date('Y-m-d H:i:s', strtotime("-{$days_to_keep} days"));
// Получаем заказы с нужными статусами и датой до $date_before
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-cancelled', 'wc-pending', 'wc-failed'],
'date_query' => [
[
'before' => $date_before,
'inclusive' => true,
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true для полного удаления
}
}
}2. Регистрируем WP-Cron задачу для запуска раз в сутки
function wpscan_schedule_order_cleanup() {
if (!wp_next_scheduled('wpscan_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpscan_daily_order_cleanup');
}
}
add_action('wp', 'wpscan_schedule_order_cleanup');
add_action('wpscan_daily_order_cleanup', 'wpscan_delete_old_wc_orders');3. Опционально: добавляем ручной запуск из админки
Для удобства можно добавить кнопку в админ-панель, чтобы запускать очистку вручную без ожидания cron.
function wpscan_order_cleanup_admin_page() {
if (isset($_POST['wpscan_cleanup_orders'])) {
check_admin_referer('wpscan_cleanup_orders_nonce');
wpscan_delete_old_wc_orders();
echo '<div class="updated notice">Заказы успешно удалены.</div>';
}
?>
<div class="wrap">
<h1>Очистка заказов WooCommerce</h1>
<form method="post">
<?php wp_nonce_field('wpscan_cleanup_orders_nonce'); ?>
<input type="submit" name="wpscan_cleanup_orders" class="button button-primary" value="Удалить старые отключённые и неоплаченные заказы" />
</form>
</div>
<?php
}
function wpscan_order_cleanup_menu() {
add_submenu_page('woocommerce', 'Очистка заказов', 'Очистка заказов', 'manage_woocommerce', 'wpscan-order-cleanup', 'wpscan_order_cleanup_admin_page');
}
add_action('admin_menu', 'wpscan_order_cleanup_menu');Проверка результата после внедрения
- Запустите ручную очистку через админ-панель или дождитесь выполнения WP-Cron (раз в сутки).
- Проверьте, что заказы со статусами
cancelled,pending,failedстарше 30 дней удалились из базы данных (раздел WooCommerce > Заказы). - Для дополнительной проверки можно использовать SQL-запрос к базе:
SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-pending', 'wc-failed') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);— число должно уменьшиться.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что WP-Cron работает. Можно запустить вручную функцию
wpscan_delete_old_wc_orders()через админку или с помощью отладки. - Удаляются не те заказы: убедитесь, что правильно указаны статусы в массиве
post_status(должно быть с префиксомwc-). - Нагрузка на сервер при большом количестве заказов: добавьте постраничный запрос с лимитом и удаляйте заказы партиями, чтобы избежать таймаутов.
- Ошибки прав доступа: убедитесь, что пользователь с ролью администратора имеет права
manage_woocommerceдля запуска ручной очистки.
Практические советы по безопасности и производительности
- Убедитесь, что удаление заказов происходит только по старым данным, чтобы не потерять актуальные заказы.
- Для больших магазинов разбейте удаление на несколько циклов с помощью пагинации, например, по 100 заказов за раз.
- Используйте WP-Cron с реальным системным cron для повышения надёжности выполнения задач.
- Перед удалением создайте бэкап базы данных или экспорт заказов на случай ошибки.
- Оптимизируйте базу и таблицы WooCommerce после массового удаления заказов с помощью плагина Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpscan.ru&utm_medium=article&utm_campaign=woocommerce-udalenie-otkluchennyh-i-neoplachennyh-zakazov-s-pomoshhyu-koda) для поддержания производительности.
Сравнение способов автоматического удаления заказов WooCommerce
| Метод | Описание | Преимущества | Недостатки |
|---|---|---|---|
| Плагины (например, WooCommerce Order Cleaner) | Готовое решение с настройками в админке | Простота установки, интерфейс | Могут создавать нагрузку, ограничены в гибкости |
| Код на functions.php или в плагине | Своя логика и расписание | Гибкость, контроль, нет лишних плагинов | Требует навыков, ответственность за правильность кода |
| Внешний скрипт с WP-CLI | Запуск по cron на сервере | Максимальная производительность, не зависит от WP-Cron | Нужен доступ к серверу, навыки работы с консолью |