wpconsult.ru wordpress WP Consult

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

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

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

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

Для начала нужно понять, какие заказы считаются "старыми" и подлежат удалению. Обычно это заказы со статусом completed, cancelled или refunded, которые не изменялись в течение нескольких месяцев.

Пример запроса для диагностики в базе данных MySQL:

SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-completed', 'wc-cancelled', 'wc-refunded') AND post_date < DATE_SUB(NOW(), INTERVAL 180 DAY);

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

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

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

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

function wpconsult_delete_old_orders() {
    global $wpdb;
    $days = 180; // Количество дней для хранения заказов

    $order_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ('wc-completed', 'wc-cancelled', 'wc-refunded') AND post_date < DATE_SUB(NOW(), INTERVAL %d DAY)",
        $days
    ));

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

2. Создаем WP-Cron задачу для регулярного запуска

Добавьте запуск функции в расписание WordPress:

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

add_action('wpconsult_daily_order_cleanup', 'wpconsult_delete_old_orders');

3. Очистка крон задач при деактивации темы (опционально)

function wpconsult_clear_order_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wpconsult_daily_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpconsult_daily_order_cleanup');
    }
}
add_action('switch_theme', 'wpconsult_clear_order_cleanup_schedule');

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

  • Запустите вручную функцию wpconsult_delete_old_orders() через консоль WP-CLI или временно вызовите ее в шаблоне.
  • Проверьте в админке WooCommerce, что старые заказы перемещены в корзину или удалены.
  • Выполните SQL-запрос из раздела диагностики, чтобы убедиться, что таких заказов стало меньше.
  • Отслеживайте логи сервера на наличие ошибок при работе cron.

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

  • Заказы не удаляются: Проверьте, что хук крон задачи зарегистрирован и выполнен. Используйте плагин WP Crontrol для диагностики.
  • Удаление не полное: wp_trash_post перемещает заказ в корзину, но не удаляет сразу. Для полного удаления используйте wp_delete_post($order_id, true).
  • Удаляются нужные заказы: Проверьте условие в SQL-запросе и корректность статусов заказов.
  • Крон задачи не запускаются: Убедитесь, что на сервере посещают сайт хотя бы раз в сутки, либо настроен системный cron для wp-cron.php.

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

  • Безопасность: Не удаляйте заказы сразу без резервных копий. Используйте корзину для возможности восстановления.
  • Производительность: Если заказов очень много, делайте удаление партиями, например по 50 заказов за один запуск, чтобы не нагружать сервер.
  • Использование WP-CLI: Для больших магазинов лучше запускать очистку через WP-CLI скрипт по планировщику сервера.

Сравнение способов реализации удаления заказов

СпособПлюсыМинусыПример
Удаление через WP-Cron и код в functions.phpАвтоматизация, гибкость, не требует плагиновЗависит от посещаемости, возможно нагрузка при большом объемеКод из статьи
Удаление через WP-CLI скриптыВысокая производительность, контроль через серверТребует доступа к серверу и навыков работы с консольюwp post delete $(wp post list --post_type=shop_order --post_status=wc-completed --date_query='before=180 days ago' --format=ids) --force
Плагины очистки базы (например, Clearfy Pro)Простота настройки, дополнительные функции оптимизацииПлатные, могут быть избыточнымиClearfy Pro
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше