Диагностика проблемы: зачем удалять заблокированные заказы в WooCommerce
В интернет-магазинах на WooCommerce иногда накапливаются заказы, которые остаются в статусе "заблокирован" или "отменен" длительное время. Это могут быть неудачные попытки оплаты, отмены платежей или заказы, заблокированные вручную. Такие записи занимают место в базе, замедляют выборки и усложняют управление заказами.
Если в вашем магазине много таких заказов, стоит автоматизировать их удаление, чтобы поддерживать базу в чистоте и улучшить производительность.
Как определить, что заказы заблокированы и подходят для удаления
По умолчанию WooCommerce использует стандартные статусы заказов, например, pending, processing, completed, cancelled, failed. Иногда магазины вводят свои кастомные статусы, например, blocked или используют определённый статус из списка.
Для начала определите, какие статусы считаются заблокированными в вашем магазине. Это можно сделать через админку WooCommerce > Статусы заказов или в плагинах, которые расширяют статусы.
Пример: допустим, заказы со статусом cancelled и failed считаются заблокированными, и их нужно удалять спустя 30 дней после создания.
Пошаговое решение: автоматическое удаление заблокированных заказов с помощью WP-Cron
Реализуем функцию, которая будет запускаться ежедневно и удалять заказы со статусами cancelled и failed, которым больше 30 дней.
1. Добавляем функцию удаления заказов
function wpaction_delete_blocked_orders() {
$statuses_to_delete = array('cancelled', 'failed');
$days_to_keep = 30;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_to_keep . ' days'));
$args = array(
'status' => $statuses_to_delete,
'date_created' => '<' . $date_threshold,
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — без перемещения в корзину
}
}2. Регистрируем ежедневное событие WP-Cron
function wpaction_schedule_blocked_orders_cleanup() {
if (!wp_next_scheduled('wpaction_daily_delete_blocked_orders')) {
wp_schedule_event(time(), 'daily', 'wpaction_daily_delete_blocked_orders');
}
}
add_action('wp', 'wpaction_schedule_blocked_orders_cleanup');
add_action('wpaction_daily_delete_blocked_orders', 'wpaction_delete_blocked_orders');3. Добавляем очистку расписания при деактивации плагина или темы
function wpaction_unschedule_blocked_orders_cleanup() {
$timestamp = wp_next_scheduled('wpaction_daily_delete_blocked_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpaction_daily_delete_blocked_orders');
}
}
register_deactivation_hook(__FILE__, 'wpaction_unschedule_blocked_orders_cleanup');Как проверить, что решение сработало
- Создайте тестовый заказ в статусе
cancelledилиfailedс датой создания более 30 дней назад (можно в базе вручную изменить дату). - Выполните вручную функцию
wpaction_delete_blocked_orders()через консоль WP-CLI или временно вызовите её в шаблоне. - Проверьте, что заказ удалён из базы (раздел WooCommerce > Заказы и таблица wp_posts с post_type = 'shop_order').
- Проверьте, что по расписанию (ежедневно) функция запускается автоматически — для этого можно временно изменить расписание на 'hourly' и отследить логи.
Частые ошибки и как их исправить
- Ошибка: Функция ничего не удаляет.
Причина: Неправильные статусы в массиве$statuses_to_deleteили отсутствие заказов с такими статусами.
Решение: Проверьте статусы заказов в базе, используйте отладку с выводом количества найденных заказов (error_log(count($orders))). - Ошибка: WP-Cron не запускается.
Причина: На сайте мало трафика или запрещены запросы cron.
Решение: Настройте системный cron на вызовwp-cron.phpили используйте внешние сервисы для запуска cron. - Ошибка: Заказы удаляются некорректно или частично.
Причина: Некорректный вызовwp_delete_postили ошибки в правах пользователя.
Решение: Проверяйте, что функция вызывается с правами администратора, и используйтеwp_delete_post($order_id, true)для полного удаления.
Практические советы по безопасности и производительности
- Перед удалением заказов делайте резервную копию базы данных.
- Используйте ограничение по дате и статусу, чтобы не удалять актуальные данные.
- Для магазинов с очень большим количеством заказов разбивайте удаление на порции, например, по 100 заказов за один запуск, чтобы избежать тайм-аутов.
- Логируйте действия удаления для последующего аудита.
- Отключите удаление заказов, если идут массовые распродажи или другие важные события.
Таблица сравнения вариантов удаления заблокированных заказов
| Способ | Плюсы | Минусы | Пример |
|---|---|---|---|
| Плагин (например, WP Sweep) | Готовое решение, интерфейс | Может удалять лишнее, нагрузка | WP Sweep — удаление ревизий и заказов |
| Код с WP-Cron (как в статье) | Точный контроль, кастомизация | Нужен кодинг, обслуживание | См. код выше |
| Ручное удаление в админке | Простота, без кода | Трудозатратно, риск забыть | Админка WooCommerce |