Диагностика проблемы с заблокированными и замедленными заказами WooCommerce
В WooCommerce иногда возникают ситуации, когда заказы остаются в статусе, который не меняется долгое время — например, «заблокированные» (failed, on-hold) или «замедленные» (pending, processing), что мешает корректному учёту и влияет на производительность базы данных. Частая причина — ошибки оплаты, сбои при обновлении статуса или некорректные плагины.
Чтобы выявить такие заказы, можно выполнить запрос к базе данных или использовать WP_Query с фильтром по статусу.
Пример запроса для поиска заблокированных заказов:
SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-failed', 'wc-on-hold') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);Этот запрос покажет заказы со статусом «failed» и «on-hold», созданные более 30 дней назад.
Пошаговое решение: автоматическое удаление таких заказов с помощью кода
Чтобы автоматизировать очистку, создадим функцию, которую можно запускать вручную или через cron. Она будет искать заказы в определённых статусах старыми более 30 дней и удалять их.
Код для удаления старых заблокированных заказов:
function wpscan_delete_stale_blocked_orders() {
$statuses_to_delete = array('wc-failed', 'wc-on-hold');
$date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));
$args = array(
'post_type' => 'shop_order',
'post_status' => $statuses_to_delete,
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date_threshold,
),
),
'fields' => 'ids',
'posts_per_page' => -1,
);
$orders = get_posts($args);
if (empty($orders)) {
error_log('No stale blocked orders found.');
return;
}
foreach ($orders as $order_id) {
wp_trash_post($order_id); // можно заменить на wp_delete_post($order_id, true) для полного удаления
error_log('Deleted stale blocked order ID: ' . $order_id);
}
}Чтобы запускать эту функцию регулярно, добавьте cron-задачу:
if (!wp_next_scheduled('wpscan_delete_stale_orders_cron')) {
wp_schedule_event(time(), 'daily', 'wpscan_delete_stale_orders_cron');
}
add_action('wpscan_delete_stale_orders_cron', 'wpscan_delete_stale_blocked_orders');Проверка результата после внедрения
1. Проверьте журнал ошибок (error_log) для сообщений о выполнении удаления.
2. В админке WooCommerce в списке заказов убедитесь, что заказы со статусами failed и on-hold старше 30 дней отсутствуют.
3. Для дополнительной проверки выполните SQL-запрос из раздела диагностики до и после запуска скрипта.
Частые ошибки и как их исправить
- Ошибка удаления заказов: функция wp_trash_post не удаляет, а помещает заказ в корзину. Используйте
wp_delete_post($order_id, true)для полного удаления. - Проблемы с cron-задачей: если WP-Cron не срабатывает, проверьте, не отключён ли он в wp-config.php (
DISABLE_WP_CRON). Для надёжности настройте системный cron для вызова wp-cron.php. - Удаляются не те заказы: убедитесь, что в массиве
$statuses_to_deleteуказаны правильные статусы с префиксомwc-. - Проблемы с производительностью: при большом количестве заказов используйте постраничный вывод (пагинацию) в запросе, чтобы не перегружать память.
Практические советы по безопасности и производительности
- Перед удалением всегда делайте резервную копию базы данных.
- Для больших магазинов запускайте удаление в off-peak часы, чтобы не влиять на работу сайта.
- Используйте
wp_trash_postвместо полного удаления, если хотите иметь возможность восстановить заказ. - Логируйте действия удаления для аудита.
- Оптимизируйте базу данных после массовых удалений с помощью плагина Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpscan.ru&utm_medium=article&utm_campaign=woocommerce-udalit-zablokirovannye-i-zamedlennye-zakazy) — это поможет очистить мусор и повысить скорость.
Сравнение методов удаления заказов
| Метод | Преимущества | Недостатки | Рекомендации |
|---|---|---|---|
| wp_trash_post() | Позволяет восстановить заказ из корзины | Заказы остаются в базе, занимают место | Использовать при нерешительности с окончательным удалением |
| wp_delete_post($id, true) | Полное удаление из базы данных | Нельзя восстановить без резервной копии | Использовать для чистки старых заказов |
| Удаление через SQL | Самый быстрый способ | Риск повредить целостность данных, требует аккуратности | Использовать только при полном понимании структуры данных |