WooCommerce: как автоматически удалять отменённые заказы и товары с нулевым остатком

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

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

Как автоматически удалять заказы со статусом «Отменено»

WooCommerce хранит заказы как тип записи shop_order, а статус хранится в метаполе _order_status или напрямую через статус поста с префиксом wc-. Чтобы удалять отменённые заказы автоматически, удобно использовать хук WordPress wp_cron для периодического запуска функции очистки.

Пошаговое решение:

  1. Добавьте функцию удаления отменённых заказов в файл functions.php вашей темы или в кастомный плагин.
  2. Создайте или зарегистрируйте задачу cron, которая будет запускать эту функцию регулярно (например, раз в сутки).
function wpb_delete_cancelled_orders() {
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-cancelled',
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];
    $orders = get_posts($args);
    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // принудительное удаление
        }
    }
}

// Регистрация cron события при активации темы или плагина
if (!wp_next_scheduled('wpb_daily_delete_cancelled_orders')) {
    wp_schedule_event(time(), 'daily', 'wpb_daily_delete_cancelled_orders');
}

// Привязка функции к событию cron
add_action('wpb_daily_delete_cancelled_orders', 'wpb_delete_cancelled_orders');

Проверка результата

  • В админке WooCommerce перейдите в раздел заказов и убедитесь, что отменённые заказы удалены.
  • Через phpMyAdmin или аналог проверьте, что в таблице wp_posts нет записей с post_type = 'shop_order' и статусом wc-cancelled.
  • Для теста можно вручную изменить статус заказа на «Отменён» и запустить функцию вручную в консоли или временно привязать её к кнопке.

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

Удаление товаров с нулевым остатком требует проверки метаполя _stock для товаров и их вариаций. Для вариаций product_variation — отдельный тип записи.

Пошаговое решение:

  1. Создайте функцию, которая ищет товары и вариации с запасом 0.
  2. Удалите их программно.
  3. Запустите функцию через cron для регулярного поддержания.
function wpb_delete_out_of_stock_products() {
    $args = [
        'post_type' => ['product', 'product_variation'],
        'posts_per_page' => -1,
        'meta_query' => [
            [
                'key' => '_stock',
                'value' => 0,
                'compare' => '=',
                'type' => 'NUMERIC'
            ]
        ],
        'fields' => 'ids',
    ];
    $products = get_posts($args);
    if (!empty($products)) {
        foreach ($products as $product_id) {
            wp_delete_post($product_id, true);
        }
    }
}

// Регистрация cron задачи
if (!wp_next_scheduled('wpb_daily_delete_out_of_stock_products')) {
    wp_schedule_event(time(), 'daily', 'wpb_daily_delete_out_of_stock_products');
}

add_action('wpb_daily_delete_out_of_stock_products', 'wpb_delete_out_of_stock_products');

Проверка результата

  • В админке WooCommerce проверьте, что товары и вариации с нулевым запасом удалены.
  • Проверьте таблицу wp_posts на наличие записей с post_type = 'product' и _stock = 0.

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

  • Отсутствие cron задачи: Функции не запускаются без правильно зарегистрированного cron. Проверьте работу cron через плагин WP Crontrol.
  • Неверный статус заказа: Убедитесь, что статус отменённого заказа — wc-cancelled. Иногда могут быть кастомные статусы.
  • Удаление не того типа записей: Ошибки в post_type или метаполях могут привести к неправильному удалению. Тестируйте на тестовом сайте.
  • Проблемы с правами доступа: Функция должна выполняться с правами администратора или без ограничений. Используйте wp_delete_post с force_delete = true.

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

  • Перед удалением данных всегда делайте резервную копию базы.
  • Для больших магазинов используйте постраничный выбор (posts_per_page с пагинацией), чтобы избежать превышения лимита памяти.
  • Логируйте удалённые ID в отдельный файл для аудита.
  • Для запуска cron задач можно использовать системный cron вместо wp_cron для надёжности.
  • Используйте плагин Clearfy Pro для оптимизации базы и удаления дублированных данных, если нужно комплексное решение (Подробнее о Clearfy Pro).

Сравнительная таблица методов удаления

МетодПреимуществаНедостаткиПрименимость
Ручное удаление через админкуПростота, контрольТрудозатратно, риск пропускаМаленькие магазины
Автоматизация через wp_cron + кодАвтоматизация, гибкостьЗависит от частоты посещений, может тормозить при большом объёмеСредние и крупные магазины
Плагины очистки (Clearfy Pro, WP-Optimize)Удобство, дополнительные функцииПотенциальные конфликты, лицензированиеВсе уровни, при необходимости комплексной оптимизации
WooCommerce: как автоматически удалять заказы со статусом «Отменено»
19.05.2026
Как создать автоматическое отключение неиспользуемых тем в WordPress
02.02.2026
Как создать динамические виджеты в WordPress с помощью REST API
03.04.2026
WooCommerce: как автоматически удалять отменённые заказы и товары с нулевым остатком
30.05.2026
WooCommerce: как исправить проблему с вариантами отправки после покупки
30.04.2026