wpcat.ru wordpress WPCat.ru

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

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

Со временем база заказов WooCommerce может разрастаться, включая заказы со статусами, которые уже не актуальны (например, отменённые или проваленные). Это замедляет работу сайта, увеличивает размер базы данных и усложняет управление. Нужно организовать автоматическое удаление таких заказов, чтобы поддерживать производительность и порядок.

Как определить, какие заказы считать устаревшими

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

  • cancelled — отменённые заказы, которые не будут возобновлены;
  • failed — неуспешные попытки оплаты;
  • refunded — возвращённые заказы, если не требуется хранить историю;
  • on-hold — заказы в ожидании, которые не меняются длительное время.

Важно уточнить бизнес-логику, чтобы не удалить нужные данные.

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

Добавим функцию, которая при запуске удалит все заказы с определёнными статусами старше заданного количества дней. Запускаем её через WP-Cron или вручную.

1. Функция удаления заказов по статусу и дате

function wpcat_delete_old_orders_by_status( $statuses = array('cancelled', 'failed'), $days = 30 ) {
    if ( empty($statuses) ) {
        return;
    }

    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Получаем ID заказов
    $placeholders = implode(",", array_fill(0, count($statuses), '%s'));
    $query = $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ($placeholders) AND post_date < %s",
        ...$statuses, $date_threshold
    );

    $order_ids = $wpdb->get_col($query);
    if ( empty($order_ids) ) {
        return;
    }

    foreach ( $order_ids as $order_id ) {
        wp_trash_post( $order_id ); // Можно заменить на wp_delete_post($order_id, true) для полного удаления
    }
}

2. Запуск функции через планировщик WP-Cron

Чтобы автоматизировать задачу, создадим событие, которое будет вызываться раз в сутки.

add_action('wpcat_daily_delete_old_orders', 'wpcat_delete_old_orders_cron');

function wpcat_delete_old_orders_cron() {
    wpcat_delete_old_orders_by_status(array('cancelled', 'failed'), 30);
}

// Запланировать событие при активации темы или плагина
if ( ! wp_next_scheduled( 'wpcat_daily_delete_old_orders' ) ) {
    wp_schedule_event( time(), 'daily', 'wpcat_daily_delete_old_orders' );
}

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

  • Проверьте наличие заказов со статусами cancelled или failed старше 30 дней в разделе WooCommerce → Заказы.
  • Запустите функцию вручную в консоли или через временную кнопку для теста:
wpcat_delete_old_orders_by_status(array('cancelled', 'failed'), 30);
  • После запуска заказы должны переместиться в корзину или полностью удалиться (в зависимости от выбранной функции).
  • Проверьте в базе данных таблицу wp_posts (тип shop_order) — устаревших заказов не должно быть.

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

  • Нет удаления заказов: проверьте, что статусы указаны правильно (cancelled, failed), и что заказы действительно старше указанного срока.
  • Функция не запускается по расписанию: убедитесь, что WP-Cron активен и на сайте есть посещения, которые его инициируют. Для теста можно вызвать функцию вручную.
  • Удалились нужные заказы: проверьте логику выбора статусов и срока хранения, возможно, стоит увеличить количество дней или исключить определённые статусы.
  • Ошибки в SQL-запросе: внимательно проверяйте подготовку запроса, используйте дебаг для отладки (например, error_log($query);).

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

  • Используйте wp_trash_post() вместо wp_delete_post(), чтобы иметь возможность восстановить заказ при ошибке.
  • Удаляйте заказы партиями (например, по 100 штук), чтобы избежать таймаутов при большом объёме данных.
  • Перед массовым удалением сделайте резервную копию базы данных.
  • Регулярно проверяйте логи ошибок PHP и WooCommerce для выявления проблем.
  • Если заказов много, рассмотрите отключение WooCommerce транзиентов и оптимизацию таблиц базы данных.

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

МетодПреимуществаНедостатки
Ручное удаление через админку WooCommerceПростота, нет кодаНужно время и внимание, не автоматизировано
Использование WP-Cron и кастомного кода (как в статье)Автоматизация, контроль, гибкостьТребует навыков, возможны ошибки без тестирования
Плагины для очистки заказовУдобство, готовые настройкиДополнительная нагрузка, зависимость от сторонних разработчиков
×

Пора действовать!

Скидки на
WordPress!

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

Успей купить ⋙