wpdebug.ru wordpress WP Debug

WooCommerce: автоматическое удаление отменённых и отложенных заказов для оптимизации базы данных

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

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

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

Для начала проверьте количество заказов с статусами cancelled, failed и on-hold. Это можно сделать через SQL-запрос к таблице wp_posts (замените префикс wp_ на ваш):

SELECT post_status, COUNT(*) AS count FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-failed', 'wc-on-hold') GROUP BY post_status;

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

Пошаговое решение: автоматическое удаление старых отменённых и отложенных заказов с помощью WP-Cron

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

1. Добавление функции удаления заказов

function wpdebug_delete_old_wc_orders() {
    if ( ! class_exists( 'WooCommerce' ) ) {
        return; // WooCommerce не активен
    }

    $statuses_to_delete = array( 'wc-cancelled', 'wc-failed', 'wc-on-hold' );
    $days_old = 30; // удалять заказы старше 30 дней

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses_to_delete,
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => "$days_old days ago",
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    );

    $orders = get_posts( $args );
    if ( empty( $orders ) ) {
        return;
    }

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true ); // принудительное удаление
    }
}

2. Регистрация события WP-Cron для запуска функции ежедневно

add_action( 'wpdebug_daily_cleanup', 'wpdebug_delete_old_wc_orders' );

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

3. Запуск задачи вручную для проверки

Для проверки работы функции можно вызвать её вручную через админку или WP-CLI:

wp eval 'wpdebug_delete_old_wc_orders();'

Как проверить, что автоматическое удаление работает

  • Через базу данных повторите SQL запрос из раздела диагностики — количество старых заказов должно уменьшиться.
  • Включите логирование в WordPress и добавьте внутри функции error_log с количеством удалённых заказов.
  • Проверьте, что событие WP-Cron запланировано с помощью плагина WP Crontrol или команды WP-CLI wp cron event list.

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

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

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

  • Добавьте nonce и проверки прав, если хотите расширять функционал для запуска из админки.
  • Для крупных магазинов используйте WP-CLI-скрипты с пакетной обработкой заказов, чтобы избежать таймаутов.
  • Перед удалением всегда делайте резервную копию базы данных.
  • Используйте плагин Clearfy Pro для оптимизации базы и дополнительной чистки данных (https://wpshop.ru/plugins/clearfy?utm_source=wpdebug.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udaleniye-otmenennyh-i-zamedlennyh-zakazov).

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

МетодПлюсыМинусы
Ручное удаление через админкуПростота, нет кодаДолго, риск пропуска
WP-Cron с кастомной функциейАвтоматизация, гибкость параметровЗависимость от посещений сайта, требует кода
WP-CLI скриптыБыстро, подходит для больших сайтовТребует доступа к серверу, навыков Shell
Плагины оптимизации (например, Clearfy Pro)Удобно, дополнительные функции очисткиПлатные, может влиять на производительность
×

AI-плагин

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

SEO и мета-теги

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

Изображения

Комментарии

Подробнее