wpload.ru wordpress WPLoad.ru

Автоматическое удаление заказов WooCommerce со статусом «ожидает оплату» старше 30 дней

Проблема: накапливание неактивных заказов в WooCommerce

В интернет-магазинах на WooCommerce часто возникает ситуация, когда заказы со статусом «ожидает оплату» (pending) не закрываются и не удаляются автоматически. Это ведёт к разрастанию базы заказов, замедлению работы админки и усложнению аналитики. Особенно актуально для магазинов с высокой посещаемостью и большим количеством отказов от оплаты.

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

Чтобы проверить, есть ли такая проблема, зайдите в админку WooCommerce > Заказы и отфильтруйте заказы по статусу Ожидает оплаты. Если вы видите большое количество заказов с этим статусом, которым больше месяца, нужно автоматизировать их удаление.

Как проверить дату создания заказа и статус через код

function check_old_pending_orders() {
    $args = [
        'status' => 'pending',
        'date_created' => '<' . ( new WC_DateTime() )->modify('-30 days')->format('Y-m-d H:i:s'),
        'limit' => -1
    ];
    $orders = wc_get_orders($args);
    return count($orders);
}

// Выводим в лог количество старых заказов
error_log('Старых заказов pending: ' . check_old_pending_orders());

Пошаговое решение: автоматизация удаления заказов старше 30 дней

Для удаления заказов старше 30 дней с статусом «ожидает оплату» используем кастомный PHP-код в functions.php темы или отдельном плагине. Код срабатывает по крону (wp_cron) раз в сутки.

1. Создаём функцию удаления заказов

function wpload_delete_old_pending_orders() {
    $args = [
        'status' => 'pending',
        'date_created' => '<' . ( new WC_DateTime() )->modify('-30 days')->format('Y-m-d H:i:s'),
        'limit' => -1
    ];
    $orders = wc_get_orders($args);
    foreach ( $orders as $order ) {
        $order->delete(true); // true — удаление без возможности восстановления
    }
}

2. Регистрируем событие wp_cron для запуска раз в сутки

function wpload_schedule_pending_orders_cleanup() {
    if ( ! wp_next_scheduled( 'wpload_pending_orders_cleanup_hook' ) ) {
        wp_schedule_event(time(), 'daily', 'wpload_pending_orders_cleanup_hook');
    }
}
add_action('wp', 'wpload_schedule_pending_orders_cleanup');

add_action('wpload_pending_orders_cleanup_hook', 'wpload_delete_old_pending_orders');

3. Убираем крон при деактивации темы/плагина

function wpload_remove_pending_orders_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wpload_pending_orders_cleanup_hook');
    if ($timestamp) {
        wp_clear_scheduled_hook('wpload_pending_orders_cleanup_hook');
    }
}
register_deactivation_hook(__FILE__, 'wpload_remove_pending_orders_cleanup_schedule');

Проверка результата

  • После добавления кода и прохождения суток проверьте в базе заказов наличие старых заказов со статусом «ожидает оплату».
  • При необходимости запустите функцию вручную через WP-CLI или временно добавьте вызов wpload_delete_old_pending_orders() в functions.php и обновите сайт.
  • Проверьте логи ошибок, чтобы убедиться, что нет фатальных ошибок.

Частые ошибки и как их исправить

  • Крон не срабатывает: Проверьте, что в WordPress включён wp_cron (опция DISABLE_WP_CRON не установлена в true). Для теста вызовите вручную do_action('wpload_pending_orders_cleanup_hook');.
  • Функция удаления не работает: Убедитесь, что используете правильный метод $order->delete(true);. Без параметра true — заказ только в корзину отправляется.
  • Удаляются не те заказы: Проверьте условие date_created < '30 дней назад' и статус pending. Можно вывести в лог список ID удаляемых заказов.
  • Ошибка из-за версии WooCommerce: Используйте последние версии WooCommerce. Функция wc_get_orders() и класс WC_DateTime должны поддерживаться.

Практические советы по безопасности и производительности

  • Удаление заказов — необратимая операция. Рекомендуется перед внедрением сделать резервную копию базы.
  • Если заказов очень много, можно удалять партиями для снижения нагрузки (например, по 50 штук за запуск).
  • Для уменьшения нагрузки на сервер используйте WP-CLI скрипты для периодического запуска, если wp_cron не надёжно срабатывает.
  • Добавьте логирование удалённых заказов в отдельный файл для аудита.
  • Рассмотрите возможность использования плагина Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpload.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udalenie-zakazov-posle-30-dnej-bez-oplaty) для комплексной оптимизации WooCommerce.

Сравнение вариантов автоматического удаления заказов

МетодПлюсыМинусыРекомендации
Плагин (готовый)Простота установки и настройкиМожет быть тяжёлым, лишний кодИспользовать для быстрого старта
Кастомный код с wp_cronЛёгкий, под контролем разработчикаНужны навыки разработки, контроль cronЛучше для стабильных и безопасных решений
WP-CLI скриптыМаксимальная производительность и контрольТребует SSH доступа и навыковДля крупных магазинов с большой нагрузкой
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше