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

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

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

Чтобы избежать этого, полезно настроить автоматическое удаление товаров, у которых запас равен нулю или меньше, без необходимости вручную проверять каждый товар.

Пошаговое решение: как реализовать автоматическое удаление товаров с нулевым запасом

1. Создание WP-Cron задачи для регулярной проверки товаров

Для автоматизации используем встроенный планировщик задач WordPress — wp_cron. Он будет запускать функцию, которая будет искать и удалять товары без запаса.

if ( ! wp_next_scheduled( 'wc_delete_out_of_stock_products_daily' ) ) {
    wp_schedule_event( time(), 'daily', 'wc_delete_out_of_stock_products_daily' );
}

2. Функция удаления товаров без запаса

Функция должна искать все товары с мета-полем _stock равным 0 или меньше и статусом publish. Затем удалять их программно.

add_action( 'wc_delete_out_of_stock_products_daily', 'wc_delete_out_of_stock_products' );

function wc_delete_out_of_stock_products() {
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'post_status'    => 'publish',
        'meta_query'     => array(
            array(
                'key'     => '_stock',
                'value'   => 0,
                'compare' => '<=',
                'type'    => 'NUMERIC'
            ),
        ),
        'fields'         => 'ids',
    );

    $out_of_stock_products = get_posts( $args );

    foreach ( $out_of_stock_products as $product_id ) {
        wp_trash_post( $product_id );
    }
}

3. Очистка задачи при деактивации темы или плагина

Чтобы не создавать мусор в планировщике, удаляем событие при деактивации.

function wc_clear_scheduled_delete_event() {
    $timestamp = wp_next_scheduled( 'wc_delete_out_of_stock_products_daily' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wc_delete_out_of_stock_products_daily' );
    }
}
register_deactivation_hook( __FILE__, 'wc_clear_scheduled_delete_event' );

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

  • Запустите задачу вручную для проверки:
    do_action( 'wc_delete_out_of_stock_products_daily' );
    
  • Проверьте, что товары с запасом <= 0 ушли в корзину.
  • Посмотрите в админке WooCommerce раздел «Товары», убедитесь, что отсутствуют товары без запаса.
  • Через сутки убедитесь, что задача сработала автоматически (можно проверить логи или добавить логирование в функцию).

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

  • Ошибка: Задача не запускается автоматически.
    Причина: wp_cron срабатывает только при посещении сайта, на слабом трафике — задержки.
    Решение: Настройте системный cron на сервере для вызова wp_cron.php по расписанию.
  • Ошибка: Функция не удаляет товары с вариациями.
    Причина: У вариативных товаров запас хранится в вариациях, а не в основном товаре.
    Решение: Добавьте проверку и удаление вариаций с нулевым запасом или удаляйте весь вариативный товар, если все вариации без запаса.
  • Ошибка: Товары удаляются сразу, а не попадают в корзину.
    Причина: Используется wp_delete_post вместо wp_trash_post.
    Решение: Используйте wp_trash_post, чтобы можно было восстановить товар при ошибке.

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

  • Добавьте логирование удалений в отдельный файл для аудита и контроля.
  • Для больших магазинов используйте постраничный запрос с posts_per_page, чтобы избегать превышения лимита памяти.
  • Проверяйте права пользователя, если добавляете вызов функции через интерфейс.
  • Перед удалением можно отправлять уведомление администратору с отчетом.

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

МетодОписаниеПлюсыМинусы
Использование wp_cron и кастомной функции PHPРегулярный запуск скрипта, удаляющего товары без запасаПолный контроль, легко кастомизируется, не требует плагиновЗависит от трафика, требует настройки cron для надежности
Плагин для управления запасамиГотовые решения с настройками удаления или скрытия товаровУдобство, поддержка, часто дополнительные функцииМожет быть избыточным, нагрузка, ограниченная кастомизация
Ручное удаление через админкуУдаление товаров вручную при проверке запасовПростой вариант без кодаТрудозатратно, риск ошибки, не подходит для больших магазинов
Как создать автономную систему комментирования в WordPress без плагинов
04.02.2026
WooCommerce: как автоматически удалять просроченные заказы
26.04.2026
Оптимизация кода в WordPresses: эффективное использование хуков и фильтров
02.11.2025
Как отключить Emoji в WordPress для ускорения загрузки сайта
15.03.2026
Как создать многоязычный сайт на WordPress без плагинов
23.02.2026