wpcorp.ru wordpress WP Corp

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

Зачем нужно автоматически удалять старые отменённые заказы в WooCommerce

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

Диагностика проблемы: как понять, что старые отменённые заказы мешают

  • Медленная работа админки WooCommerce при просмотре заказов.
  • Большой размер таблиц wp_posts и wp_postmeta в базе данных.
  • Резервные копии занимают много места из-за большого объёма данных заказов.
  • Ошибки при экспорте или импорте заказов из-за повреждённых или устаревших данных.

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

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

В functions.php вашей активной темы или в плагине-снппете добавьте следующий код:

function wc_delete_old_cancelled_orders() {
    if ( ! class_exists( 'WooCommerce' ) ) {
        return;
    }

    global $wpdb;
    $days = 30; // Удалять заказы старше 30 дней
    $date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    // Получаем ID заказов со статусом cancelled старше указанной даты
    $order_ids = $wpdb->get_col( $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < %s",
        $date
    ) );

    if ( empty( $order_ids ) ) {
        return;
    }

    foreach ( $order_ids as $order_id ) {
        wp_delete_post( $order_id, true ); // true - принудительное удаление без перемещения в корзину
    }
}

2. Запускаем очистку по расписанию WP-Cron

Добавим еженедельное задание для запуска функции:

function wc_schedule_delete_old_cancelled_orders() {
    if ( ! wp_next_scheduled( 'wc_delete_old_cancelled_orders_event' ) ) {
        wp_schedule_event( time(), 'weekly', 'wc_delete_old_cancelled_orders_event' );
    }
}
add_action( 'wp', 'wc_schedule_delete_old_cancelled_orders' );

add_action( 'wc_delete_old_cancelled_orders_event', 'wc_delete_old_cancelled_orders' );

3. При необходимости — отключение задания

Для удаления задания используйте следующий код (например, временно для отладки):

function wc_unschedule_delete_old_cancelled_orders() {
    $timestamp = wp_next_scheduled( 'wc_delete_old_cancelled_orders_event' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wc_delete_old_cancelled_orders_event' );
    }
}

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

  • Через админку WooCommerce перейдите в раздел «Заказы» и проверьте наличие старых заказов со статусом отменён.
  • Выполните вручную функцию через WP-CLI: wp eval 'wc_delete_old_cancelled_orders();', если доступен CLI.
  • Проверьте схему расписаний WP-Cron командой wp cron event list для подтверждения, что событие запланировано.
  • Сравните размер таблиц wp_posts и wp_postmeta до и после удаления.

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

  • Функция не запускается автоматически: Проверьте, что на сайте посещения есть, так как WP-Cron зависит от трафика. Для серверов с низким трафиком настройте реальный cron на сервере.
  • Не удаляются заказы старше нужного срока: Проверьте формат даты и статус заказа. В WooCommerce статус отменённого заказа — wc-cancelled, а не просто cancelled.
  • Удаление заказов приводит к ошибкам в отчётах: Убедитесь, что вы удаляете только заказы, которые точно не нужны, и делаете резервную копию базы перед очисткой.
  • Повторное добавление cron вызывает дублирование: Используйте проверку wp_next_scheduled перед планированием.

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

  • Всегда делайте резервные копии базы данных перед массовым удалением данных.
  • Используйте wp_delete_post( $order_id, true ) для полного удаления, чтобы не оставалось метаданных.
  • Если база очень большая, разбивайте удаление на партии, чтобы избежать превышения лимитов времени выполнения скрипта.
  • Для сайтов с большим трафиком лучше настроить системный cron вместо WP-Cron, это повысит надёжность.
  • Перед удалением убедитесь, что нет внешних плагинов, которые зависят от истории отменённых заказов.

Сравнение способов удаления старых отменённых заказов

МетодПлюсыМинусыКомпромисс
Ручное удаление через админкуПростота, контрольТрудоёмко, риск забытьДля небольших магазинов
Код с WP-Cron (описанный выше)Автоматизация, гибкостьЗависит от трафика, требует настройкиОптимально для большинства сайтов
Системный Cron + WP-CLIНадёжность, скоростьТребует доступа к серверуДля профессиональных администраторов
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее