Диагностика проблемы: зачем удалять отмененные заказы в WooCommerce
В больших магазинах на WooCommerce количество заказов со статусом «Отменен» может расти и засорять базу данных. Это замедляет админ-панель, увеличивает размер резервных копий и усложняет отчеты. По умолчанию WooCommerce не удаляет отмененные заказы, оставляя их для статистики и истории. Но если ваша бизнес-логика или политика хранения данных требует очистки, стоит автоматизировать удаление.
Как автоматически удалять заказы со статусом «отменен»
Шаг 1: Создание функции удаления заказов
Для начала создадим функцию, которая будет находить и удалять заказы со статусом cancelled старше определенного количества дней. В нашем примере — заказы старше 30 дней.
function wpb_delete_old_cancelled_orders() {
// Количество дней, после которых заказы удаляются
$days = 30;
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID заказов со статусом cancelled старше $days
$args = [
'status' => 'cancelled',
'limit' => -1, // без лимита
'date_created' => '<' . $date,
'return' => 'ids',
];
$orders = wc_get_orders($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_trash_post($order_id); // перемещаем в корзину
// или wp_delete_post($order_id, true); // удаление безвозвратно
}
}
}Шаг 2: Автоматизация с помощью WP-Cron
Чтобы запускать очистку по расписанию, добавим событие в планировщик WordPress. Ниже — регистрация ежедневного задания.
function wpb_schedule_delete_cancelled_orders() {
if (!wp_next_scheduled('wpb_daily_delete_cancelled_orders')) {
wp_schedule_event(time(), 'daily', 'wpb_daily_delete_cancelled_orders');
}
}
add_action('wp', 'wpb_schedule_delete_cancelled_orders');
add_action('wpb_daily_delete_cancelled_orders', 'wpb_delete_old_cancelled_orders');Шаг 3: Добавление возможности отключить или изменить период
Вынесите число дней в константу или настройку для гибкости и безопасности.
Проверка результата после внедрения
1. Убедитесь, что в админке WooCommerce есть отмененные заказы старше 30 дней.
2. Запустите вручную функцию wpb_delete_old_cancelled_orders() (через WP-CLI или временно в коде).
3. Проверьте, что заказы перемещены в корзину (если используете wp_trash_post) или удалены.
4. Проверьте cron-задания через плагин WP Crontrol, чтобы убедиться, что задача запланирована.
5. На следующий день проверьте, что функция сработала автоматически.
Частые ошибки при автоматическом удалении заказов
- Неправильный статус заказа: В WooCommerce статус отмененного заказа —
cancelled, а неcancelилиcanceled. - Отсутствие прав на удаление: Функция выполняется от имени пользователя с недостаточными правами, что приводит к ошибкам при удалении.
- WP-Cron не срабатывает: Если на сервере мало трафика или cron отключен, задачи не выполняются автоматически. Проверьте работу WP-Cron или настройте системный cron.
- Удаление заказов с важной информацией: Убедитесь, что удаление отмененных заказов не нарушает требования бухгалтерии или политики хранения данных.
Практические советы по безопасности и производительности
- Используйте
wp_trash_post()вместоwp_delete_post()для возможности восстановления заказов. - Добавьте логирование удалений, чтобы отслеживать действия и время очистки.
- Если заказов много, выполняйте удаление пакетами, чтобы не перегружать сервер.
- Настройте системный cron для надежного запуска задач, если WP-Cron ненадежен.
- Перед удалением делайте резервное копирование базы данных.
Таблица сравнения методов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| wp_trash_post() | Безопасно, можно восстановить заказ | Заказы остаются в базе, не освобождают место |
| wp_delete_post(true) | Полное удаление, освобождение места | Удаление безвозвратно, риск потери данных |
| Удаление через SQL-запросы | Очень быстро при большом объеме | Риск повреждения данных, пропуск хуков WooCommerce |