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

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

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

Как проверить, что проблема существует

  • Перейдите в каталог магазина и найдите товары с запасом 0.
  • Убедитесь, что они по-прежнему доступны для покупки.
  • Проверьте в админке WooCommerce в разделе "Товары" — товары с нулевым запасом должны иметь статус "Опубликовано".

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

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

1. Добавление функции проверки и изменения статуса

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

    $query = new WP_Query( $args );

    if ( $query->have_posts() ) {
        while ( $query->have_posts() ) {
            $query->the_post();
            $product_id = get_the_ID();

            // Меняем статус на черновик
            $updated = wp_update_post( array(
                'ID'          => $product_id,
                'post_status' => 'draft',
            ) );

            if ( is_wp_error( $updated ) ) {
                error_log('Ошибка обновления статуса товара ID '. $product_id);
            }
        }
        wp_reset_postdata();
    }
}

2. Создание задания cron для автоматического запуска

Добавим функцию в wp_cron для регулярного выполнения:

if ( ! wp_next_scheduled( 'wc_auto_update_stock_status_event' ) ) {
    wp_schedule_event( time(), 'hourly', 'wc_auto_update_stock_status_event' );
}

add_action( 'wc_auto_update_stock_status_event', 'wc_auto_update_product_status_by_stock' );

3. Обратное обновление статуса, если товар снова в наличии

Важно вернуть статус товара на "опубликовано", если запас появился:

function wc_restore_product_status_if_in_stock() {
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'post_status'    => 'draft',
        'meta_query'     => array(
            array(
                'key'     => '_stock',
                'value'   => 0,
                'compare' => '>',
                'type'    => 'NUMERIC',
            ),
        ),
    );

    $query = new WP_Query( $args );

    if ( $query->have_posts() ) {
        while ( $query->have_posts() ) {
            $query->the_post();
            $product_id = get_the_ID();

            $updated = wp_update_post( array(
                'ID'          => $product_id,
                'post_status' => 'publish',
            ) );

            if ( is_wp_error( $updated ) ) {
                error_log('Ошибка восстановления статуса товара ID '. $product_id);
            }
        }
        wp_reset_postdata();
    }
}
add_action( 'wc_auto_update_stock_status_event', 'wc_restore_product_status_if_in_stock' );

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

  • Подождите выполнение cron (можно вручную запустить через WP Crontrol или аналогичные плагины).
  • Проверьте в админке, что товары с нулевым запасом стали "черновиками".
  • Проверьте, что товары с запасом > 0 снова публикуются.
  • В каталоге сайта товары с нулевым запасом больше не отображаются.

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

  • Не срабатывает cron-задача: проверьте, что WordPress cron работает, или настройте системный cron для wp-cron.php.
  • Статус не меняется: убедитесь, что у пользователя, запускающего скрипт, есть права на редактирование товаров.
  • Запросы WP_Query слишком тяжелые на большом каталоге: добавьте пагинацию или оптимизируйте мета-запросы.
  • Кеширование мешает обновлениям: очистите кеш сайта и плагинов после изменений.

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

  • Вместо массового обновления всех товаров за одну итерацию, используйте пагинацию по 50 товаров, чтобы избежать таймаутов.
  • Добавляйте логи ошибок для мониторинга работы скрипта.
  • Отключите отображение товаров с нулевым запасом в настройках WooCommerce, чтобы не дублировать логику.
  • Используйте WP CLI для отладки и запуска задач вручную при необходимости.

Сравнение вариантов реализации

ВариантПлюсыМинусыКогда использовать
Автоматический WP Cron с кодомПолный контроль, без плагиновЗависит от работы WP Cron, нагрузка на сайтДля магазинов с небольшим/средним каталогом
Плагин для управления запасамиГотовое решение, поддержка, интерфейсДополнительные зависимости, ресурсыДля больших магазинов и нет времени на кодинг
Ручное изменение статусовПростота, контрольРучной труд, риск ошибокМалый каталог, редкие обновления
Как создать собственный шорткод в WordPress
06.11.2025
Как создать динамические виджеты на PHP
18.11.2025
Как удалить неиспользуемые шорткоды в WordPress без плагинов
07.04.2026
Как создать автоматический раздел постов в WordPress по дате и категории
08.03.2026
Оптимизация кода в WordPresses: эффективное использование хуков и фильтров
02.11.2025