Диагностика проблемы: почему статус товара не меняется автоматически
В стандартном 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 с обновлением запасов | Массовое обновление | Статусы могут не обновиться автоматически | Использовать с кастомным кодом |