Диагностика проблемы с неоплаченными заказами
В интернет-магазинах на WooCommerce часто накапливаются неоплаченные заказы, которые занимают место в базе данных и могут усложнять управление заказами. Особенно это актуально для магазинов с большим трафиком и частыми отменами. Если вручную удалять такие заказы неудобно, стоит автоматизировать процесс.
Проверьте, сколько неоплаченных заказов находится в вашей базе. Для этого можно использовать SQL-запрос или встроенные средства WooCommerce:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending';Если число большое (сотни или тысячи), пора автоматизировать удаление.
Как автоматически удалять неоплаченные заказы через WP-Cron
Для автоматического удаления заказов со статусом wc-pending можно использовать WP-Cron и написать кастомный PHP-скрипт, который будет запускаться, например, раз в сутки.
Пошаговое решение
- Добавляем функцию удаления неоплаченных заказов:
function wpapp_delete_unpaid_orders() {
$args = array(
'limit' => -1,
'status' => 'pending',
'return' => 'ids',
'date_created' => '<' . ( time() - DAY_IN_SECONDS * 3 ) // удалить заказы старше 3 дней
);
$orders = wc_get_orders( $args );
if ( empty( $orders ) ) {
return;
}
foreach ( $orders as $order_id ) {
$order = wc_get_order( $order_id );
if ( $order ) {
$order->delete( true ); // удалить заказ без возможности восстановления
}
}
}- Создаем задачу WP-Cron для регулярного запуска:
function wpapp_schedule_unpaid_orders_cleanup() {
if ( ! wp_next_scheduled( 'wpapp_cleanup_unpaid_orders_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wpapp_cleanup_unpaid_orders_hook' );
}
}
add_action( 'wp', 'wpapp_schedule_unpaid_orders_cleanup' );
add_action( 'wpapp_cleanup_unpaid_orders_hook', 'wpapp_delete_unpaid_orders' );- Добавляем возможность запуска вручную из админки (опционально):
add_action( 'admin_post_wpapp_manual_cleanup', function() {
if ( current_user_can( 'manage_woocommerce' ) ) {
wpapp_delete_unpaid_orders();
wp_redirect( admin_url( 'edit.php?post_type=shop_order&message=cleanup_done' ) );
exit;
}
});
add_action( 'admin_notices', function() {
if ( isset( $_GET['message'] ) && $_GET['message'] === 'cleanup_done' ) {
echo '<div class="notice notice-success is-dismissible">Неоплаченные заказы успешно удалены.</div>';
}
});Проверка результата после внедрения
- Перед активацией кода сделайте резервную копию базы.
- Подождите 24 часа или вручную запустите функцию через URL
wp-admin/admin-post.php?action=wpapp_manual_cleanup. - Проверьте, что заказы со статусом
pendingстарше 3 дней удалились. - В админке WooCommerce в списке заказов проверьте отсутствие старых неоплаченных заказов.
- Можно повторно выполнить SQL-запрос для подсчёта оставшихся неоплаченных заказов.
Частые ошибки и как их исправить
- Код не запускается автоматически: Убедитесь, что WP-Cron работает, и ваш сайт получает посетителей (WP-Cron запускается при заходах на сайт). Для теста можно временно заменить
dailyнаhourly. - Удаляются не те заказы: Проверьте параметры
statusиdate_created. По умолчанию мы удаляем только заказы со статусомpendingи возрастом более 3 дней. - Ошибка доступа при ручном запуске: Проверьте, что пользователь имеет права
manage_woocommerce. - Заказы не удаляются: Возможно, у вас плагин кеширования или ограничения на уровне хостинга, блокирующие WP-Cron или функции удаления.
Практические советы по безопасности и производительности
- Удаляйте заказы только с проверкой возраста — чтобы не удалять свежие заказы случайно.
- В тестовой среде сначала проверьте работу функции на нескольких тестовых заказах.
- Используйте транзакции базы данных, если у вас крупный магазин с тысячами заказов, чтобы не перегрузить сервер.
- Соблюдайте резервное копирование — особенно перед автоматическим удалением данных.
- Если не хотите писать код, рассмотрите плагины, например, Clearfy Pro с функцией очистки базы, но там будет меньше контроля.
Сравнение вариантов автоматического удаления неоплаченных заказов
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Трудозатратно, не подходит для больших магазинов | Подходит для малого объема заказов |
| WP-Cron с кастомным кодом (как в статье) | Полный контроль, можно настроить параметры | Нужны базовые навыки PHP и понимание WP-Cron | Рекомендуется для средних и больших магазинов |
| Плагины очистки (например, Clearfy Pro) | Удобно и быстро, встроенные инструменты | Меньше гибкости, возможно платно | Подходит для пользователей без навыков программирования |