wpdebug.ru wordpress WP Debug

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

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

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

Удаление таких заказов позволяет:

  • Снизить размер таблиц wp_posts и wp_postmeta, связанных с заказами;
  • Уменьшить время выполнения запросов к базе данных;
  • Оптимизировать работу WooCommerce и ускорить админ-панель;
  • Облегчить резервное копирование и восстановление данных.

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

Для начала нужно оценить, сколько в базе отменённых и отложенных заказов:

SELECT post_status, COUNT(ID) as total FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

Основные статусы заказов WooCommerce:

  • wc-cancelled — отменённые;
  • wc-pending — ожидающие оплаты (часто отложенные);
  • wc-processing — в обработке;
  • wc-completed — завершённые.

Если количество отменённых и ожидающих оплаты заказов исчисляется тысячами, есть смысл их удалить для оптимизации.

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

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

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

function wpdebug_delete_orders_by_status( $statuses = array() ) {
    if ( empty( $statuses ) ) {
        return 0;
    }

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses,
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $orders = get_posts( $args );
    $deleted_count = 0;

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true ); // true - без перемещения в корзину
        $deleted_count++;
    }

    return $deleted_count;
}

2. Создаём WP-CLI команду для запуска удаления из терминала

if ( defined( 'WP_CLI' ) && WP_CLI ) {
    WP_CLI::add_command( 'wpdebug delete-orders', function( $args, $assoc_args ) {
        $statuses = isset( $assoc_args['status'] ) ? explode( ',', $assoc_args['status'] ) : array();
        if ( empty( $statuses ) ) {
            WP_CLI::error( 'Необходимо указать статус(-ы) заказов через параметр --status' );
        }
        $count = wpdebug_delete_orders_by_status( $statuses );
        WP_CLI::success( "Удалено заказов: $count" );
    } );
}

Пример запуска в терминале (в корне сайта):

wp wpdebug delete-orders --status=wc-cancelled,wc-pending

3. Автоматизация через WP-Cron

Чтобы удалять заказы автоматически, добавьте в functions.php следующий код:

add_action( 'wpdebug_delete_old_orders_cron', function() {
    $statuses = array( 'wc-cancelled', 'wc-pending' );
    $deleted = wpdebug_delete_orders_by_status( $statuses );
    error_log( "WPDebug: удалено заказов по крону - $deleted" );
});

// Регистрируем событие, если оно ещё не запущено
if ( ! wp_next_scheduled( 'wpdebug_delete_old_orders_cron' ) ) {
    wp_schedule_event( time(), 'daily', 'wpdebug_delete_old_orders_cron' );
}

Этот код запустит удаление отменённых и ожидающих оплат заказов раз в сутки.

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

После запуска кода или WP-CLI команды:

  • Выполните SQL-запрос из раздела диагностики и убедитесь, что количество заказов со статусами wc-cancelled и wc-pending уменьшилось.
  • Проверьте, что новые заказы с этими статусами создаются и не удаляются преждевременно (например, если вы хотите не удалять заказы младше 7 дней, добавьте фильтр даты).
  • В административной панели WooCommerce обновите список заказов и убедитесь, что отменённые и отложенные заказы исчезли.

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

  • Удаление заказов не происходит: проверьте, активирован ли WP-CLI и правильно ли подключён код. Ошибка в названии статусов.
  • Заказы удаляются слишком рано: добавьте фильтрацию по дате создания, чтобы удалять заказы старше определённого срока. Например, в функцию wpdebug_delete_orders_by_status можно добавить аргумент date_query в get_posts.
  • Cron не запускается: убедитесь, что на сайте есть трафик для активации WP-Cron или настройте системный cron для вызова wp-cron.php.
  • Потеря важных данных: перед удалением сделайте резервную копию базы данных.

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

  • Удаляйте заказы с помощью wp_delete_post с вторым параметром true, чтобы удаление было полным и не оставляло «мусор» в базе.
  • При большом количестве заказов разбивайте удаление на порции, чтобы избежать тайм-аутов сервера.
  • Используйте WP-CLI для пакетной работы — это быстрее и надёжнее, чем удаление через интерфейс.
  • Добавьте логирование в файл ошибок для контроля удаления.
  • Ограничьте доступ к WP-CLI и кода удаления только администраторам.

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

Пример изменения функции с учётом удаления только заказов старше 30 дней:

function wpdebug_delete_old_orders( $statuses = array(), $days_old = 30 ) {
    if ( empty( $statuses ) ) {
        return 0;
    }

    $date_query = array(
        'before' => date( 'Y-m-d', strtotime("-{$days_old} days") ),
        'inclusive' => true,
    );

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses,
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'date_query'     => array( $date_query ),
    );

    $orders = get_posts( $args );
    $deleted_count = 0;

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true );
        $deleted_count++;
    }

    return $deleted_count;
}

Так вы защититесь от удаления свежих заказов.

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

МетодПлюсыМинусыРекомендации
WP-CLI командаБыстрое удаление, контроль из консолиТребуется доступ к серверу и WP-CLIИспользовать для разовых и регулярных операций
WP-Cron автоматизацияАвтоматическое удаление без участияЗависит от посещаемости сайта, сложнее отладитьРекомендуется для регулярного обслуживания
Ручное удаление через админкуПросто для небольших объёмовНеэффективно при большом количестве заказовИспользовать для единичных случаев
×

AI-плагин

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

SEO и мета-теги

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

Изображения

Комментарии

Подробнее