wpcat.ru wordpress WPCat.ru

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

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

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

Проверьте в админке WooCommerce на странице редактирования товара, что поле «Управлять запасами» активно и указано корректное количество. Также обратите внимание на настройку «Статус наличия», которая в некоторых случаях задаётся вручную и не синхронизируется с запасами.

Как проверить проблему

  • В админке откройте товар с нулевым запасом — проверьте, стоит ли статус «Нет в наличии».
  • Обновите запас товара программно или через импорт и посмотрите, изменился ли статус.
  • Если статус не меняется, значит автоматическая синхронизация не работает.

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

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

add_action('woocommerce_product_set_stock', 'auto_update_product_stock_status', 10, 1);
function auto_update_product_stock_status($product) {
    if (!$product instanceof WC_Product) return;

    $stock_quantity = $product->get_stock_quantity();

    if ($stock_quantity > 0) {
        $product->set_stock_status('instock');
    } else {
        $product->set_stock_status('outofstock');
    }

    $product->save();
}

Объяснение:

  • woocommerce_product_set_stock — хук, вызываемый при обновлении запаса товара.
  • Функция проверяет текущий запас и меняет статус на instock или outofstock.
  • $product->save(); сохраняет изменения.

Обработка вариативных товаров

Для вариативных товаров нужно отдельно обновлять статус у родительского товара в зависимости от статусов вариаций:

add_action('woocommerce_variation_set_stock', 'auto_update_variable_product_stock_status', 10, 1);
function auto_update_variable_product_stock_status($variation) {
    $parent_id = $variation->get_parent_id();
    $parent_product = wc_get_product($parent_id);

    if (!$parent_product) return;

    $variations = $parent_product->get_children();
    $in_stock = false;

    foreach ($variations as $variation_id) {
        $var = wc_get_product($variation_id);
        if ($var && $var->is_in_stock()) {
            $in_stock = true;
            break;
        }
    }

    $parent_product->set_stock_status($in_stock ? 'instock' : 'outofstock');
    $parent_product->save();
}

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

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

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

  • Код не работает после обновления запаса: проверьте, что функции подключены в правильном месте (functions.php или плагин) и что нет конфликтов с другими плагинами, изменяющими складские запасы.
  • Статус не меняется у вариативных товаров: убедитесь, что используется именно хук woocommerce_variation_set_stock, и что родительский товар правильно загружается через wc_get_product().
  • Изменения статуса не отображаются на сайте: проверьте, не кэшируется ли страница товара (плагин кэширования, серверный кэш).
  • Производительность страдает при массовом обновлении: рассмотрите отключение автообновления при импорте и запуск отдельного скрипта, который обновит статусы пакетно.

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

  • Избегайте запуска кода при массовом импорте через REST API или CSV — используйте проверку контекста, например, if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;.
  • Для больших магазинов оптимизируйте код, чтобы не вызывать $product->save() слишком часто, объединяйте обновления.
  • Используйте Clearfy Pro для чистки кэшей и оптимизации WooCommerce, чтобы избежать конфликтов с кэшированием статуса товара.

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

МетодПлюсыМинусыПример использования
Код на хуках WooCommerceЛегко кастомизировать, не нужен плагинТребует навыков PHP, возможны конфликтыПример в статье выше
Плагины для управления запасамиГотовые решения, интерфейсМогут замедлять сайт, платныеWooCommerce Stock Manager и др.
Импорт и экспорт CSV с обновлением запасовМассовое обновлениеСтатусы могут не обновиться автоматическиИспользовать с кастомным кодом
×
Обнови свой WordPress!

Держи скидку 15% на премиум тему Reboot

Купить со скидкой ⋙