Диагностика проблемы с заблокированными заказами в WooCommerce
В интернет-магазинах на WooCommerce часто накапливаются заказы с статусом failed или cancelled, а также с другими статусами, которые означают неудачные или заблокированные платежи. Эти записи не удаляются автоматически и со временем могут замедлять работу базы данных, увеличивать размер таблиц и усложнять аналитику.
Чтобы проверить наличие таких заказов, выполните SQL-запрос в базе данных WordPress:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-failed', 'wc-cancelled', 'wc-pending');Если количество таких заказов превышает несколько тысяч, это сигнал к необходимости автоматической очистки.
Пошаговое решение: автоматическое удаление заблокированных заказов с помощью WP-Cron
1. Определяем статусы для удаления
Обычно удаляют заказы со статусами:
wc-failed— неудачные платежиwc-cancelled— отменённые вручную или системойwc-pending— неоплаченные заказы, забытые пользователями
2. Создаём функцию удаления заказов
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
function wpaction_delete_blocked_orders() {
$statuses_to_delete = array( 'wc-failed', 'wc-cancelled', 'wc-pending' );
$args = array(
'post_type' => 'shop_order',
'post_status' => $statuses_to_delete,
'posts_per_page' => -1,
'fields' => 'ids',
'date_query' => array(
array(
'before' => '30 days ago', // Удаляем заказы старше 30 дней
'inclusive' => true,
),
),
);
$orders = get_posts($args);
if (empty($orders)) {
return;
}
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Принудительное удаление
}
}3. Регистрируем задачу WP-Cron для регулярного запуска
Добавьте хук для запуска функции один раз в сутки:
if (!wp_next_scheduled('wpaction_delete_blocked_orders_daily')) {
wp_schedule_event(time(), 'daily', 'wpaction_delete_blocked_orders_daily');
}
add_action('wpaction_delete_blocked_orders_daily', 'wpaction_delete_blocked_orders');4. Очистка по требованию (опционально)
Для ручного запуска в админке можно добавить обработчик:
add_action('admin_post_wpaction_manual_delete_orders', function() {
if (!current_user_can('manage_woocommerce')) {
wp_die('Доступ запрещён');
}
wpaction_delete_blocked_orders();
wp_redirect(admin_url('edit.php?post_type=shop_order&message=deleted'));
exit;
});Проверка результата после внедрения
- Запустите вручную функцию через WP-CLI:
wp eval 'wpaction_delete_blocked_orders();' - Проверьте количество заказов со статусами
wc-failed,wc-cancelledиwc-pendingдо и после запуска:SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-failed', 'wc-cancelled', 'wc-pending'); - Убедитесь, что по истечении суток заказы старше 30 дней удаляются автоматически (проверьте логи WP-Cron или временно добавьте запись в лог внутри функции).
Частые ошибки и как их исправить
- Заказы не удаляются, WP-Cron не запускается. Проверьте, активен ли WP-Cron на сайте. Для этого создайте файл
wp-cron-check.phpс кодомwp_cron()и запустите его. Иногда необходимо настроить системный cron или использовать плагин WP-Crontrol. - Удаляются не те заказы или отсутствует фильтр по дате. Проверьте правильность параметров
date_queryи статусов в массиве$statuses_to_delete. - Ошибка доступа при ручном запуске. Убедитесь, что текущий пользователь имеет право
manage_woocommerceили замените наmanage_options, если требуется. - Удаление занимает слишком много времени или вызывает таймаут. В этом случае разбейте удаление на чанки, например, по 100 заказов за один запуск, и используйте повторный запуск WP-Cron.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы данных перед автоматическим удалением заказов.
- Используйте
wp_delete_post($order_id, true)с флагомtrueдля принудительного удаления, чтобы исключить попадание в корзину. - Чтобы избежать нагрузки на сервер, планируйте удаление в ночное время и делайте это пакетами.
- Для мониторинга работы WP-Cron включите логирование через плагин WP Crontrol или добавьте кастомные записи в лог-файл.
- Если у вас большое количество заказов, рассмотрите возможность удаления не только заказов, но и связанных метаданных через прямые SQL-запросы, однако делайте это с осторожностью.
Сравнение методов удаления заблокированных заказов в WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота, безопасность | Трудоёмко при большом количестве заказов |
| Автоматизация через WP-Cron и PHP | Полная автоматизация, гибкость настройки | Необходимость контроля WP-Cron и правильного кода |
| Использование плагинов очистки базы | Удобство, интерфейс | Риск несоответствия требованиям, нагрузка, стоимость |