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

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

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

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

1. Подключение функции удаления товаров через wp_cron

Реализуем задачу с помощью планировщика WordPress — WP-Cron. Будем запускать еженедельную проверку товаров и удалять те, у которых запас меньше заданного порога.

function wc_auto_delete_low_stock_products() {
    $threshold = 2; // Минимальный остаток для удаления

    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => array(
            array(
                'key'     => '_stock',
                'value'   => $threshold,
                'compare' => '<=',
                'type'    => 'NUMERIC',
            ),
        ),
        'post_status'    => 'publish',
    );

    $query = new WP_Query( $args );

    if ( $query->have_posts() ) {
        while ( $query->have_posts() ) {
            $query->the_post();
            wp_delete_post( get_the_ID(), true );
        }
        wp_reset_postdata();
    }
}

// Регистрируем событие, если оно еще не задано
if ( ! wp_next_scheduled( 'wc_auto_delete_low_stock_event' ) ) {
    wp_schedule_event( time(), 'weekly', 'wc_auto_delete_low_stock_event' );
}

// Хук на событие
add_action( 'wc_auto_delete_low_stock_event', 'wc_auto_delete_low_stock_products' );

2. Настройка порога и частоты проверки

В данном примере порог задан как 2, то есть товары с запасом 2 и менее будут удаляться. Частоту можно изменить с 'weekly' на 'daily' или 'hourly', если необходима более частая очистка.

3. Очистка и резервное копирование

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

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

Для проверки работы функции:

  • Создайте тестовый товар с остатком <= 2.
  • Запустите функцию вручную, вызвав wc_auto_delete_low_stock_products() через консоль WP-CLI или временно добавьте вызов в functions.php.
  • Проверьте, что товар удалился из админки и каталога.
  • Дождитесь срабатывания wp_cron (или запустите вручную через WP-CLI wp cron event run wc_auto_delete_low_stock_event).

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

  • Товары не удаляются: проверьте, что у товаров заполнено поле _stock. Иногда складские запасы не учитываются, если включен управляющий запасом плагин. Убедитесь, что запасы актуальны.
  • WP-Cron не срабатывает: на некоторых хостингах WP-Cron нужно запускать через системный cron. Проверьте логи и вручную запустите событие для отладки.
  • Удаляются не те товары: проверьте параметр compare и тип поля в запросе meta_query. Иногда _stock хранится как строка, что влияет на сравнение.
  • Потеря важных товаров: добавьте дополнительные фильтры, например по категории или меткам, чтобы исключить из удаления товары с определенными статусами или важностью.

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

  • Используйте wp_delete_post( $post_id, true ) с параметром true для полного удаления, чтобы избежать накопления мусора.
  • Ограничивайте количество удаляемых записей за раз, чтобы не перегружать базу, особенно на больших магазинах. Можно добавить пагинацию в WP_Query.
  • Проверяйте права пользователя и запускайте удаление от имени администратора или системного пользователя.
  • Добавьте логирование удаленных товаров в отдельный файл или базу, чтобы отслеживать изменения.

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

МетодПлюсыМинусыПрименимость
WP-Cron + кастомный код Полный контроль, гибкая логика Требует навыков программирования, зависит от cron Средние и крупные магазины с возможностью тестирования
Плагины управления запасами Простота установки, готовый функционал Может быть избыточно, не всегда гибко Малые магазины, не требующие кастомной логики
Ручное удаление через админку Простота, нет ошибок кода Ручной труд, не автоматизировано Магазины с небольшим ассортиментом

Код для запуска функции вручную (для тестирования)

add_action('admin_init', function() {
    if ( isset($_GET['run_low_stock_delete']) && current_user_can('manage_options') ) {
        wc_auto_delete_low_stock_products();
        wp_die('Удаление товаров с низким остатком выполнено');
    }
});

После добавления этого кода в functions.php, перейдите по адресу https://ваш-сайт/wp-admin/?run_low_stock_delete=1 для запуска удаления вручную.

Как удалить неиспользуемые файлы в Media Library WordPress: практические методы и примеры
28.12.2025
Как добавить поддержку JSON-LD в WordPress
19.01.2026
Как отображать выбор даты в WordPress с применением Advanced Custom Fields
19.03.2026
Как сделать защиту от спама в комментариях WordPress
14.11.2025
Как удалить пустые термины в WordPress: эффективные методы и примеры кода
16.03.2026