Автоматическое удаление товаров в WooCommerce по статусу заказов и остаткам

Диагностика задачи: зачем автоматизировать удаление товаров в WooCommerce

В крупных интернет-магазинах на WooCommerce часто накапливаются товары, которые давно не продаются, имеют отрицательный или нулевой запас, либо связаны с отменёнными заказами. Это негативно влияет на пользовательский опыт, SEO и производительность сайта. Ручное управление товарами – трудоёмкий процесс, который легко автоматизировать с помощью WP-Cron и кастомных скриптов.

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

В WooCommerce по умолчанию есть несколько статусов заказов: pending, processing, completed, cancelled, refunded и другие. Например, можно настроить удаление товаров, которые связаны только с отменёнными (cancelled) или возвращёнными (refunded) заказами и не имеют других продаж.

Пример кода для удаления товаров без успешных заказов

function wpbit_delete_products_by_order_status() {
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'fields' => 'ids',
    ];
    $products = get_posts($args);

    foreach ($products as $product_id) {
        $orders = wc_get_orders([
            'limit' => -1,
            'status' => ['completed', 'processing'],
            'product_id' => $product_id,
        ]);

        if (empty($orders)) {
            // Проверим, есть ли заказы с отменённым или возвращённым статусом
            $cancelled_orders = wc_get_orders([
                'limit' => 1,
                'status' => ['cancelled', 'refunded'],
                'product_id' => $product_id,
            ]);

            if (!empty($cancelled_orders)) {
                wp_delete_post($product_id, true); // Полное удаление товара
            }
        }
    }
}
add_action('wpbit_daily_cleanup', 'wpbit_delete_products_by_order_status');

Этот код нужно запускать по Cron, например, с помощью WP-Cron, чтобы периодически очищать магазин.

Настройка WP-Cron для ежедневного запуска

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

Автоматическое удаление товаров с нулевым или отрицательным запасом

WooCommerce хранит количество товара в метаполе _stock. Можно написать функцию, которая удаляет товары с запасом <= 0, если они не продаются.

function wpbit_delete_products_by_stock() {
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'meta_query' => [
            [
                'key' => '_stock',
                'value' => 0,
                'compare' => '<=',
                'type' => 'NUMERIC'
            ]
        ],
        'fields' => 'ids',
    ];
    $products = get_posts($args);

    foreach ($products as $product_id) {
        $orders = wc_get_orders([
            'limit' => 1,
            'status' => ['completed', 'processing'],
            'product_id' => $product_id,
        ]);

        if (empty($orders)) {
            wp_delete_post($product_id, true);
        }
    }
}
add_action('wpbit_daily_cleanup', 'wpbit_delete_products_by_stock');

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

  • Запустите Cron вручную для теста (через WP CLI: wp cron event run wpbit_daily_cleanup).
  • Проверьте, что товары с указанными условиями действительно удалены (через админку или запросы в базе).
  • Убедитесь, что случайные товары не удалились — проверяйте логи и делайте резервные копии перед запуском.

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

  • Пустой результат в wc_get_orders: убедитесь, что в вашем WooCommerce версии 3.0+ и вы используете правильные параметры для фильтрации заказов.
  • Удаление не тех товаров: всегда фильтруйте товары по статусам заказов и запасам, добавляйте дополнительные проверки (например, дата последней продажи).
  • WP-Cron не срабатывает: проверьте, что на хостинге разрешены WP-Cron или настройте системный cron для вызова wp-cron.php.
  • Потеря данных: перед массовым удалением делайте резервное копирование базы данных.

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

  • Для больших магазинов разбивайте обработку на части — используйте posts_per_page с пагинацией и сохраняйте прогресс в опциях.
  • Запускайте тяжелые задачи в ночное время или при низкой нагрузке сайта.
  • Используйте транзакции базы данных при массовых изменениях (если есть доступ к DB напрямую).
  • Ограничьте доступ к функциям удаления — запускайте код только с правами администратора.

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

МетодПреимуществаНедостатки
Плагин для очистки WooCommerceПростота настройки, готовый интерфейсМожет быть тяжеловесным, ограниченная кастомизация
Кастомный WP-Cron с PHP кодомГибкость, точное соответствие требованиямТребует навыков разработки, возможны ошибки при неправильном коде
Ручное удаление через админкуКонтроль над каждым товаромТрудозатратно, не подходит для больших баз
Как использовать хуки WordPress для автоматизации задач
11.12.2025
Как избежать проблем с отключением WP-Cron в WordPress
20.04.2026
WooCommerce: как автоматически удалять товары с отрицательными отзывами
08.07.2026
Автоматизация обновления подписок в WordPress через AJAX
21.01.2026
WooCommerce: автоматическое удаление товаров из магазина по статусу заказов
04.06.2026