wpcat.ru wordpress WPCat.ru

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

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

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

Если вы не очищаете базу от старых заказов, со временем WooCommerce и WordPress могут работать медленнее, а админка – хуже отзываться.

Типичные статусы, которые можно считать устаревшими и удалять автоматически:

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

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

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

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

function wpcat_remove_old_orders_by_status() {
    $days_to_keep = 30; // Срок хранения заказов в днях
    $statuses_to_delete = array('cancelled', 'failed', 'refunded');

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

    foreach ($statuses_to_delete as $status) {
        $args = array(
            'post_type'      => 'shop_order',
            'post_status'    => 'wc-' . $status,
            'date_query'     => array(
                array(
                    'before' => $date_threshold,
                    'column' => 'post_date',
                ),
            ),
            'posts_per_page' => -1,
            'fields'         => 'ids',
        );

        $orders = get_posts($args);

        if (!empty($orders)) {
            foreach ($orders as $order_id) {
                wp_delete_post($order_id, true); // Полное удаление
            }
        }
    }
}

2. Запускаем функцию через Cron для регулярной очистки

Чтобы функция запускалась автоматически, добавьте событие Cron. В functions.php добавим регистрацию хука и планировщика:

// Регистрация Cron-события при активации темы или плагина
if (!wp_next_scheduled('wpcat_daily_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wpcat_daily_cleanup');
}

// Хук, который запускает функцию
add_action('wpcat_daily_cleanup', 'wpcat_remove_old_orders_by_status');

// Очистка при деактивации темы или плагина
function wpcat_remove_cron() {
    $timestamp = wp_next_scheduled('wpcat_daily_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpcat_daily_cleanup');
    }
}
register_deactivation_hook(__FILE__, 'wpcat_remove_cron');

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

  • Перейдите в раздел WooCommerce → Заказы и отфильтруйте заказы по статусам cancelled, failed или refunded.
  • Проверьте даты заказов – заказы старше 30 дней должны быть удалены.
  • Для ручного теста вызовите функцию wpcat_remove_old_orders_by_status() через wp-cli (wp eval 'wpcat_remove_old_orders_by_status();') или временно добавьте вызов функции в functions.php.
  • Убедитесь, что после запуска функция не удаляет новые заказы и не вызывает ошибок.

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

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

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

  • Используйте wp_delete_post($order_id, true) для полного удаления с метаданными, чтобы не оставлять мусор в базе.
  • Для больших магазинов с тысячами заказов оптимизируйте код, используя лимиты на партии и транзакции.
  • Проверяйте логи ошибок на предмет сбоев при удалении заказов.
  • Настройте резервное копирование перед автоматическим удалением заказов, чтобы избежать потери данных.
  • Если используете WPShop, рассмотрите Clearfy Pro для дополнительной оптимизации и очистки базы с интерфейсом.

Сравнение подходов к удалению заказов

МетодПлюсыМинусыКомпромисс
Ручное удаление через админку Просто, без кода Неэффективно при большом объеме заказов Подходит для малого магазина
Автоматизация через Cron и код Полная автоматизация, гибкость Требует навыков разработки, риск ошибок Оптимально для средних и крупных магазинов
Плагины очистки Удобство, интерфейс Зависимость от стороннего ПО, возможный конфликт Использовать проверенные решения (например, Clearfy Pro)
×
День SEO
Время сделать подарок своему WordPress!
-20% на премиум

шаблоны и плагины

Порадуй свой сайт ⋙