WooCommerce: как автоматически удалять неоплаченные заказы через код

Диагностика проблемы с неоплаченными заказами

В интернет-магазинах на 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-скрипт, который будет запускаться, например, раз в сутки.

Пошаговое решение

  1. Добавляем функцию удаления неоплаченных заказов:
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 ); // удалить заказ без возможности восстановления
        }
    }
}
  1. Создаем задачу 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' );
  1. Добавляем возможность запуска вручную из админки (опционально):
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)Удобно и быстро, встроенные инструментыМеньше гибкости, возможно платноПодходит для пользователей без навыков программирования

Наш каталог плагинов WordPress