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

Почему важно удалять неоплаченные заказы WooCommerce

В WooCommerce неоплаченные заказы (статус «pending» или «failed») могут накапливаться и загромождать базу данных, замедляя работу сайта и усложняя отчеты. Автоматическое удаление таких заказов помогает поддерживать чистоту данных и улучшает производительность.

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

Чтобы проверить, есть ли в магазине много неоплаченных заказов, выполните SQL-запрос в базе данных (через phpMyAdmin или WP-CLI):

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

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

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

1. Добавление кода в functions.php или в кастомный плагин

Используем WP-Cron для периодической проверки и удаления заказов старше определенного времени (например, 24 часа).

function wc_delete_old_unpaid_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-failed'),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => '24 hours ago',
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_trash_post($order_id);
        }
    }
}

// Планируем задачу, если еще не запланирована
if (!wp_next_scheduled('wc_delete_old_unpaid_orders_hook')) {
    wp_schedule_event(time(), 'hourly', 'wc_delete_old_unpaid_orders_hook');
}

add_action('wc_delete_old_unpaid_orders_hook', 'wc_delete_old_unpaid_orders');

2. Установка частоты задачи

В примере выше задача запускается ежечасно. При необходимости можно изменить на дневной режим, заменив 'hourly' на 'daily'.

3. Очистка задачи при удалении кода

Чтобы избежать накопления задач при удалении кода, добавьте очистку:

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

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

  • Зайдите в раздел WooCommerce → Заказы и отфильтруйте по статусу «В ожидании» или «Неудачный». Заказы старше 24 часов должны исчезнуть или быть перемещены в корзину.
  • Выполните SQL-запрос из раздела диагностики повторно, чтобы убедиться, что количество устаревших заказов уменьшилось.
  • Проверьте wp_cron с помощью плагинов типа WP Crontrol, чтобы убедиться, что задача запланирована и выполняется.

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

1. Код не выполняется — пропущен хук или задача не запланирована

Проверьте, что add_action('wc_delete_old_unpaid_orders_hook', 'wc_delete_old_unpaid_orders'); подключен, а задача запланирована через wp_next_scheduled. Для отладки можно временно запускать функцию вручную.

2. Заказы не удаляются — права доступа или кэш

Убедитесь, что WordPress работает под пользователем с правами на удаление записей. Очистите кэш сайта и браузера, чтобы увидеть изменения.

3. Заказы удаляются слишком рано или поздно

Корректируйте параметр 'before' => '24 hours ago' на нужный интервал (например, '48 hours ago').

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

  • Используйте удаление через wp_trash_post(), чтобы иметь возможность восстановить случайно удалённые заказы.
  • Чтобы полностью удалить заказы без возврата в корзину, замените на wp_delete_post($order_id, true);, но будьте осторожны с потерей данных.
  • При большом количестве заказов используйте пакетную обработку (например, по 50 заказов за запуск), чтобы не превышать лимиты памяти и времени выполнения.
  • Проверяйте выполнение cron-задач с помощью плагинов, например WP Crontrol, для своевременного обнаружения сбоев.

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

МетодПреимуществаНедостатки
Плагин (например, WooCommerce Cleanup)Готовое решение, интерфейс, настройкиДополнительный вес, возможные конфликты
Код в functions.phpЛегковесно, гибко, без сторонних зависимостейТребует знаний, возможно забыть про cron
Ручное удаление через админкуПростота, контрольТрудозатратно, не автоматизировано

Хотите научиться создавать сайты и зарабатывать на этом от 30 000 рублей в месяц?

Записаться на курс сейчас