Что такое просроченные заказы в WooCommerce и зачем их удалять?
Просроченные заказы — это заказы, которые не были оплачены или обработаны в течение заданного времени и остаются в системе, занимая место и создавая путаницу в отчетах. Автоматическое удаление таких заказов помогает поддерживать базу данных в чистоте и облегчает управление магазином.
Диагностика проблемы: как определить, что заказы просрочены
Первый шаг — понять, какие заказы считать просроченными. Обычно это заказы со статусом pending или failed, которые старше определенного количества дней. Для диагностики выполните SQL-запрос в базе данных или используйте WP-CLI:
wp wc order list --status=pending,failed --after='30 days ago'Если вы видите большое количество таких заказов, их стоит очистить автоматически.
Пошаговое решение: реализация автоматического удаления с подтверждением
1. Создание административной страницы с кнопкой подтверждения
Добавим в админку WooCommerce страницу с кнопкой, по нажатию на которую будет запускаться удаление просроченных заказов.
add_action('admin_menu', function() {
add_submenu_page(
'woocommerce',
'Удаление просроченных заказов',
'Удаление заказов',
'manage_woocommerce',
'delete-expired-orders',
'render_delete_expired_orders_page'
);
});
function render_delete_expired_orders_page() {
if (isset($_POST['delete_expired_orders_nonce']) &&
wp_verify_nonce($_POST['delete_expired_orders_nonce'], 'delete_expired_orders_action')) {
$count = delete_expired_orders();
echo '<div class="notice notice-success is-dismissible"><p>Удалено ' . $count . ' просроченных заказов.</p></div>';
}
?>
<h1>Удаление просроченных заказов WooCommerce</h1>
<form method="post">
<?php wp_nonce_field('delete_expired_orders_action', 'delete_expired_orders_nonce'); ?>
<p>Удалить все заказы со статусом <code>pending</code> и <code>failed</code>, старше 30 дней.</p>
<input type="submit" class="button button-primary" value="Удалить просроченные заказы" />
</form>
<?php
}
2. Функция удаления просроченных заказов
Функция выбирает заказы по заданным статусам и дате, затем удаляет их через WooCommerce API, чтобы корректно очистить все связанные данные.
function delete_expired_orders() {
$args = [
'status' => ['pending', 'failed'],
'date_created' => '<' . (new WC_DateTime('-30 days'))->date('Y-m-d H:i:s'),
'limit' => -1,
'return' => 'ids',
];
$orders_to_delete = wc_get_orders($args);
$count = 0;
foreach ($orders_to_delete as $order_id) {
wp_delete_post($order_id, true); // жесткое удаление заказа
$count++;
}
return $count;
}
Проверка результата после внедрения
После нажатия кнопки удаления зайдите в раздел Заказы WooCommerce и проверьте наличие заказов со статусом pending и failed, созданных более 30 дней назад. Их не должно быть.
Для дополнительной проверки можно использовать WP-CLI или SQL-запрос:
wp wc order list --status=pending,failed --after='30 days ago'Если список пуст — скрипт работает корректно.
Частые ошибки и как их исправить
- Отсутствие прав администратора: Убедитесь, что текущий пользователь имеет права
manage_woocommerceдля доступа к странице и выполнению удаления. - Неправильный формат даты: Используйте класс
WC_DateTimeдля корректного формирования даты. - Заказы не удаляются: Возможно, в базе настроено сохранение удалённых заказов или работают плагины, блокирующие удаление. Проверьте логи ошибок и отключите сторонние плагины для теста.
Практические советы по безопасности и производительности
- Используйте
wp_nonce_fieldи проверяйте nonce, чтобы избежать CSRF-атак. - Жесткое удаление (
wp_delete_post($id, true)) удаляет заказ полностью, включая метаданные. Убедитесь, что резервное копирование есть. - Запуск удаления большого количества заказов может нагружать сервер. Для больших магазинов лучше реализовать пакетное удаление с помощью AJAX и WP Cron.
- Регулярно очищайте базу и кеш, чтобы поддерживать производительность.
Сравнение вариантов удаления просроченных заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Просто и быстро для единичных заказов | Трудоемко при большом количестве заказов |
| Автоматическое удаление с подтверждением (код выше) | Контролируемый процесс, безопасное удаление | Не подходит для очень больших объемов без доработок |
| Пакетное удаление через WP-Cron | Позволяет удалять много заказов без перегрузки | Сложнее реализовать, требует дополнительных проверок |