WooCommerce: автоматическое удаление заказов после 30 дней без оплаты

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

В интернет-магазинах на WooCommerce часто накапливаются заказы со статусом pending или failed, которые не были оплачены. Такие заказы занимают место в базе данных, создают путаницу в отчетах и могут негативно влиять на производительность сайта при большом объеме данных.

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

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

1. Создание пользовательской функции удаления заказов

Ниже пример функции, которая удаляет все заказы с указанными статусами старше 30 дней:

function wpkpi_delete_old_unpaid_orders() {
    $days = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    
    // Получаем ID заказов, которые старше 30 дней и имеют статус pending или failed
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-failed'),
        'date_query'     => array(
            array(
                'before' => $date_threshold,
                'inclusive' => true,
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1
    );
    $old_orders = get_posts($args);

    if (!empty($old_orders)) {
        foreach ($old_orders as $order_id) {
            wp_delete_post($order_id, true); // true - полное удаление из базы
        }
    }
}

2. Запуск функции по расписанию с помощью WP-Cron

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

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

add_action('wpkpi_daily_order_cleanup', 'wpkpi_delete_old_unpaid_orders');

3. Отмена расписания при деактивации темы или плагина

function wpkpi_clear_scheduled_order_deletion() {
    $timestamp = wp_next_scheduled('wpkpi_daily_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpkpi_daily_order_cleanup');
    }
}
register_deactivation_hook(__FILE__, 'wpkpi_clear_scheduled_order_deletion');

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

  • С помощью phpMyAdmin или плагина для работы с базой проверьте наличие заказов со статусом pending или failed старше 30 дней. После запуска Cron они должны исчезнуть.
  • Для отладки можно временно заменить wp_delete_post($order_id, true); на запись в лог или email для подтверждения работы функции.
  • Запустите Cron вручную (например, с помощью плагина WP Crontrol) и проверьте, что функция отработала без ошибок.

Частые ошибки и способы их исправления

  • Функция не запускается: проверьте, что WP-Cron работает корректно и что событие зарегистрировано. Иногда Cron не срабатывает из-за низкой посещаемости сайта — используйте внешние сервисы для вызова wp-cron.php.
  • Заказы не удаляются: убедитесь, что в запросе правильно указаны статусы заказов с префиксом wc-. Проверьте права пользователя, под которым выполняется код, и возможность удаления постов.
  • Удаляются не те заказы: проверьте правильность даты и формата в date_query. Даты заказа берутся из поля post_date в базе.

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

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

Сравнение подходов к очистке заказов WooCommerce

МетодПреимуществаНедостатки
Ручное удаление через админкуПросто, не требует кодаНеэффективно при большом количестве заказов, риск ошибок
Автоматизация через WP-Cron (код)Автоматическая очистка, гибкость настроекЗависит от работы WP-Cron, требует базовых навыков программирования
Плагины для управления заказамиГотовые решения, удобный интерфейсМогут влиять на производительность, платные опции
WooCommerce: автоматическое изменение статуса заказа при проблемах с платежами
18.06.2026
Как отключить AJAX в WordPress для решения проблем с конфликтами плагинов
21.03.2026
Как создать динамический виджет в WordPress
20.11.2025
WooCommerce: автоматическое удаление заказов после 30 дней без оплаты
21.05.2026
Как создать отзывы с оценкой в WordPress: подробный пример и код
20.02.2026