wppartner.ru wordpress WP Partner

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

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

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

Какие статусы заказов считаются неактивными

  • pending — заказ ожидает оплаты
  • failed — оплата не прошла
  • on-hold — заказ на удержании, обычно ожидает подтверждения оплаты

Удалять заказы со статусом completed или processing не рекомендуется, так как это активные или успешные заказы.

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

Для удаления неактивных заказов создадим кастомную функцию и зарегистрируем её на выполнение по расписанию с помощью WP-Cron.

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

function wppartner_delete_old_inactive_orders() {
    $days_to_keep = 7; // Срок хранения заказов в днях
    $statuses = array('pending', 'failed', 'on-hold');

    $args = array(
        'post_type' => 'shop_order',
        'post_status' => array_map(function($status) { return 'wc-' . $status; }, $statuses),
        'date_query' => array(
            array(
                'column' => 'post_date',
                'before' => "$days_to_keep days ago",
            ),
        ),
        'posts_per_page' => -1,
        'fields' => 'ids',
    );

    $orders = get_posts($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // Удаляем заказ без возможности восстановления
    }
}

2. Регистрируем задачу WP-Cron

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

add_action('wppartner_daily_order_cleanup', 'wppartner_delete_old_inactive_orders');

3. Добавляем в functions.php или плагин

Вставьте оба кода в файл functions.php активной темы или создайте небольшой плагин для изоляции кода. Это позволит ежедневно удалять заказы старше 7 дней со статусом pending, failed и on-hold.

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

  • В админке WooCommerce перейдите в Заказы и отфильтруйте по статусам pending, failed, on-hold.
  • Отметьте дату создания заказов, чтобы убедиться, что заказы старше 7 дней удалились.
  • Для проверки можно вручную изменить дату заказа в базе через phpMyAdmin (поле post_date таблицы wp_posts) и запустить функцию вручную через WP CLI или временно добавить вызов функции в functions.php.

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

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

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

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

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

МетодПреимуществаНедостатки
WP-Cron + кастомный кодПолный контроль, бесплатный, легко кастомизируемыйЗависит от работы WP-Cron, возможна нагрузка при больших объемах
Плагины очистки базы (например, WP-Sweep)Удобство, графический интерфейс, дополнительные функцииМожет удалять лишнее, не всегда гибко настраивается
Удаление через SQL запросы в базеБыстро и эффективно при больших данныхРиск повреждения данных, требует знаний SQL и резервных копий
×
Делай сайт лучше!!

-20% на премиум темы и плагины

Использовать скидку ⋙