WooCommerce: автоматическое удаление неоплаченных заказов с генерацией отчета

Диагностика проблемы: почему нужно удалять неоплаченные заказы

В WooCommerce накопление неоплаченных заказов может создать несколько проблем: увеличивается размер базы данных, снижается производительность, а владельцы магазинов получают искаженную статистику продаж. Особенно актуально для магазинов с большим трафиком и множеством брошенных корзин.

Для диагностики текущей ситуации выполните SQL-запрос в базе данных, чтобы увидеть количество заказов в статусе pending или failed:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed');

Если число заказов большое (например, тысячи), стоит настроить автоматическое удаление таких записей.

Пошаговое решение: автоматическое удаление неоплаченных заказов с отчетом

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

Добавьте следующий код в файл functions.php вашей дочерней темы или создайте простой плагин:

function wpall_delete_unpaid_orders_report() {
    $days_to_keep = 3; // Срок хранения неоплаченных заказов (в днях)
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_to_keep} days"));

    // Получаем неоплаченные заказы старше срока
    $args = [
        'post_type' => 'shop_order',
        'post_status' => ['wc-pending', 'wc-failed'],
        'date_query' => [
            [
                'column' => 'post_date',
                'before' => $date_threshold,
            ],
        ],
        'posts_per_page' => -1,
        'fields' => 'ids',
    ];

    $query = new WP_Query($args);
    $deleted_orders = [];

    if ($query->have_posts()) {
        foreach ($query->posts as $order_id) {
            wp_delete_post($order_id, true);
            $deleted_orders[] = $order_id;
        }
    }

    // Генерация отчета
    if (!empty($deleted_orders)) {
        $report = "Удалены неоплаченные заказы (ID): " . implode(", ", $deleted_orders);
        error_log($report);
    } else {
        error_log("Нет неоплаченных заказов для удаления.");
    }
}

// Запускаем функцию ежедневно
add_action('wp_loaded', function() {
    if (!wp_next_scheduled('wpall_daily_delete_unpaid_orders')) {
        wp_schedule_event(time(), 'daily', 'wpall_daily_delete_unpaid_orders');
    }
});
add_action('wpall_daily_delete_unpaid_orders', 'wpall_delete_unpaid_orders_report');

2. Проверка работы крона

Для отладки и проверки вызова можно временно запустить функцию вручную:

add_action('init', function() {
    if (isset($_GET['run_delete_unpaid'])) {
        wpall_delete_unpaid_orders_report();
        echo 'Удаление неоплаченных заказов выполнено, проверьте журнал ошибок.';
        exit;
    }
});

После добавления этого кода вызовите https://ваш-сайт.ru/?run_delete_unpaid=1 и проверьте, что в логе ошибок (error_log) появляются сообщения об удалении.

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

  • Проверьте, что в базе данных wp_posts количество заказов со статусами wc-pending и wc-failed уменьшилось.
  • Убедитесь, что в системном логе PHP (error_log) появляются записи с ID удалённых заказов.
  • Просмотрите журнал WooCommerce или используйте плагин для мониторинга заказов, чтобы убедиться, что старые неоплаченные заказы исчезли.

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

  • Крон не запускается: убедитесь, что WP-Cron активен и на вашем сайте есть посещения, запускающие задачи. Для точного запуска можно настроить системный cron на сервере.
  • Заказы не удаляются: проверьте права пользователя, под которым работает WordPress, и убедитесь, что wp_delete_post вызывается с параметром true для полного удаления.
  • Отчет не пишется в лог: проверьте настройки PHP error_log и убедитесь, что туда записываются сообщения. Для удобства можно добавить вывод отчета в файл через file_put_contents.

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

  • Удаление заказов следует делать с осторожностью — убедитесь, что заказы действительно не оплачены и не нужны для отчетности.
  • При большом количестве заказов разбивайте удаление на порции, чтобы избежать таймаутов и перегрузки сервера.
  • Сохраняйте резервные копии базы данных перед внедрением автоматического удаления.
  • Для отчетности можно интегрировать отправку отчета на почту администратора, добавив в функцию wp_mail.
  • Для повышения производительности используйте WP CLI команду для удаления заказов, если есть доступ к серверу.

Сравнение вариантов реализации удаления неоплаченных заказов

СпособПлюсыМинусы
Код в functions.php + WP-CronБесплатно, гибко, легко настроитьЗависит от посещаемости сайта, возможны таймауты при большом количестве заказов
Плагин для очистки заказов (например, Advanced Order Cleanup)Интерфейс, готовые настройкиМожет быть избыточным, дополнительная нагрузка, обновления и совместимость
WP CLI скриптБыстро, без нагрузки на сайт, подходит для больших базТребует доступа к серверу и навыков работы с командной строкой
WooCommerce: автоматическое изменение цены продукта при добавлении в корзину
15.05.2026
Оптимизация admin-ajax.php в WordPress: как решить проблемы с нагрузкой и медленной загрузкой
30.12.2025
Как создать собственный виджет в WordPress с примерами кода
14.11.2025
WooCommerce: автоматическое удаление неоплаченных заказов по срокам с помощью кода
05.05.2026
Как создать автоответчик в комментариях WordPress
13.02.2026