Как удалить заблокированные или замедленные заказы WooCommerce с помощью кода

Диагностика проблемы с заказами WooCommerce

Иногда интернет-магазины на WooCommerce сталкиваются с проблемой накопления «заблокированных» или «зависших» заказов. Это могут быть заказы со статусом failed, pending или on-hold, которые давно не обновлялись и начинают тормозить работу базы данных и админки. Чтобы понять, есть ли такая проблема, выполните следующие шаги:

  • Зайдите в раздел WooCommerce → Заказы и отфильтруйте заказы по статусу failed, pending, on-hold.
  • Проверьте дату создания заказов — если есть много старых заказов с этими статусами, которые не обновлялись более месяца, это потенциальная проблема.
  • Выполните SQL-запрос в базе данных для подсчёта количества заказов по статусам и дате создания. Например:
SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY) GROUP BY post_status;

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

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

WooCommerce хранит заказы как посты с типом shop_order. Для удаления заказов по определённым условиям можно написать кастомный скрипт, который можно запустить один раз через functions.php вашей темы или через WP-CLI.

Ниже пример функции, которая удалит все заказы со статусом failed, pending и on-hold, старше 30 дней:

function delete_old_stuck_orders() {
    $statuses = array('wc-failed', 'wc-pending', 'wc-on-hold');
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses,
        'date_query'     => array(
            array(
                'before' => date('Y-m-d', strtotime('-30 days')),
                'inclusive' => true,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $orders = get_posts($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true - удаляет полностью из базы
    }

    return count($orders);
}

// Запуск функции один раз
add_action('init', function() {
    if (current_user_can('manage_woocommerce')) {
        $deleted = delete_old_stuck_orders();
        if ($deleted) {
            error_log("Удалено $deleted старых заказов WooCommerce");
        }
    }
});

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

Удаление заказов через WP-CLI

Если у вас есть доступ к командной строке на сервере, можно использовать WP-CLI для удаления заказов:

wp post delete $(wp post list --post_type='shop_order' --post_status='wc-failed,wc-pending,wc-on-hold' --date_query_before='30 days ago' --field=ID) --force

Команда удалит все заказы с указанными статусами старше 30 дней.

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

Чтобы убедиться, что скрипт или команда отработали корректно, выполните следующие действия:

  • Зайдите в админку WooCommerce → Заказы и проверьте, что количество заказов с указанными статусами уменьшилось или стало нулём.
  • Сделайте SQL-запрос, аналогичный диагностическому, чтобы убедиться, что старые заказы удалены.
  • Проверьте логи сервера или error_log, если использовали код с записью в лог.

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

  • Заказы не удаляются полностью: проверьте, что используете wp_delete_post($order_id, true) с параметром true для полного удаления. Без него заказы попадут в корзину и останутся в базе.
  • Скрипт запускается на каждой загрузке и тормозит сайт: используйте флаг или ограничение запуска, либо запускайте через WP-CLI.
  • Недостаточно прав для удаления заказов: убедитесь, что текущий пользователь имеет capability manage_woocommerce или запускайте WP-CLI от имени администратора.
  • Удаление заказов приводит к потере данных важных для аналитики: сделайте резервную копию базы данных перед удалением и подумайте о сохранении данных в отдельной таблице.

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

  • Перед удалением всегда делайте полную резервную копию базы данных.
  • Запускайте удаление в периоды низкой нагрузки сайта, чтобы избежать замедления для пользователей.
  • Оптимизируйте таблицы базы данных после удаления:
    OPTIMIZE TABLE wp_posts;
    OPTIMIZE TABLE wp_postmeta;
  • Если заказов очень много, удаляйте партиями, чтобы избежать тайм-аутов PHP. Например, по 100 заказов за раз с паузой.
  • Документируйте причины удаления, чтобы в будущем понимать, почему и когда была проведена чистка.

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

МетодПреимуществаНедостаткиПример использования
Код в functions.phpГибкость, возможность автоматизацииРиск частого выполнения, влияет на производительностьФункция с хуком init для удаления
WP-CLIБыстрое удаление, без нагрузки на сайтТребуется доступ к серверу и командной строкеКоманда wp post delete с фильтрами
Плагины очисткиПростота использования, UIМогут быть тяжёлыми, не всегда точные фильтрыПлагины типа WP Bulk Delete
Как удалить неиспользуемые метаданные товаров WooCommerce для оптимизации базы данных
12.06.2026
Как защитить WordPress от атак с помощью Content Security Policy
20.12.2025
Авторизация через социальные сети в WordPress: лучшие решения и примеры кода
02.03.2026
Как защитить WordPress от враждебных комментариев и спама: практические методы
15.03.2026
Как защитить WordPress от DoS-атак: эффективные методы и примеры
31.12.2025