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

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

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

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

Проверьте количество записей в таблице wp_posts с типом shop_order. Если их слишком много, и большинство – со статусом completed или cancelled старше 6 месяцев – пора автоматизировать удаление.

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_date < DATE_SUB(NOW(), INTERVAL 6 MONTH);

Если цифра превышает несколько тысяч, это может негативно влиять на производительность запросов WooCommerce.

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

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

function hueman_delete_old_woocommerce_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-completed', 'wc-cancelled', 'wc-failed'),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => '6 months ago',
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => 100, // Обрабатываем по 100 за раз для нагрузки
        'no_found_rows'  => true,
    );

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // true - удаление без возврата в корзину
        }
    }
}

2. Регистрация задачи в WP-Cron

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

add_action('hueman_daily_old_orders_cleanup', 'hueman_delete_old_woocommerce_orders');

3. Добавление кнопки для ручного запуска в админке (опционально)

add_action('admin_menu', function() {
    add_submenu_page(
        'woocommerce',
        'Очистка старых заказов',
        'Очистка заказов',
        'manage_woocommerce',
        'hueman-orders-cleanup',
        function() {
            if (isset($_POST['hueman_cleanup_orders'])) {
                hueman_delete_old_woocommerce_orders();
                echo '<div class="updated notice">Очистка выполнена.</div>';
            }
            echo '<h1>Очистка старых заказов WooCommerce</h1>';
            echo '<form method="post"><button type="submit" name="hueman_cleanup_orders" class="button button-primary">Удалить заказы старше 6 месяцев</button></form>';
        }
    );
});

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

  • Запустите вручную функцию через админку или подождите выполнение WP-Cron (раз в сутки).
  • Повторите SQL-запрос на количество старых заказов. Количество должно уменьшиться.
  • Проверьте логи ошибок PHP и WooCommerce на наличие проблем с удалением.
  • Убедитесь, что удалённые заказы не отображаются в админке WooCommerce.

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

  • Ошибка: WP-Cron не срабатывает регулярно.
    Решение: Настройте системный cron на сервере или запускайте вручную через админку.
  • Ошибка: Удаляются не те заказы, либо удаление не происходит.
    Решение: Проверьте правильность статусов в запросе и формат даты в date_query.
  • Ошибка: Удаление вызывает таймаут или перегрузку сервера.
    Решение: Уменьшите posts_per_page и разбейте удаление на несколько вызовов.
  • Ошибка: Заказы не удаляются полностью (остаются метаданные).
    Решение: Используйте wp_delete_post($order_id, true) с параметром true для полного удаления.

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

  • Перед внедрением автоматического удаления сделайте резервную копию базы данных.
  • Проверяйте совместимость с другими плагинами, которые могут расширять типы заказов или статусы.
  • Контролируйте нагрузку: делайте удаление в ночное время и ограничивайте количество удаляемых заказов за один проход.
  • Используйте транзакции или логирование, если хотите отслеживать удалённые заказы.
  • Регулярно проверяйте состояние WP-Cron с помощью плагинов типа WP Crontrol.

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

МетодПлюсыМинусы
Ручное удаление через админкуПростота, контрольТрудозатратно, не автоматично
WP-Cron с кастомной функциейАвтоматизация, гибкостьЗависимость от WP-Cron, нагрузка при большом объёме
Плагины очистки базы (Clearfy Pro и др.)Готовые решения, удобный интерфейсПлатные, возможны конфликты

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как создать динамические отзывы с изменяющейся оценкой в WordPress
17.03.2026
Как создать автозаполняемую форму в WordPress с помощью AJAX
30.11.2025
Как автоматически изменять стоимость товаров в WooCommerce по условиям
09.06.2026
Как создать адаптивный блок в WordPress с помощью кастомного кода и плагинов
03.12.2025
Оптимизация кэша и использование Object Cache в WordPress: практическое руководство
30.03.2026
×

Создай идеальный сайт – теперь на 15% дешевле!

Подобрать тему →