Как удалить заблокированные или замедленные заказы 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
Как создать собственный шорткод в WordPress: полное руководство
15.11.2025
Автоматическое удаление неоплаченных заказов в WooCommerce по срокам
07.05.2026
Как защитить WordPress от прохождения по слухам и сидтам: практические методы и кодовые решения
15.02.2026
Как отключить XML-RPC в WordPress: эффективные методы с примерами кода и плагинов
07.01.2026
Удаление метаданных из фото в WordPress: как защитить сайт и ускорить загрузку
04.01.2026