Диагностика проблемы: почему статус товара не обновляется автоматически
В стандартной установке WooCommerce статус наличия товара (в наличии / нет в наличии) не меняется автоматически при обновлении количества на складе, если только не включено управление запасами. Но в ряде случаев, особенно при массовом импорте или синхронизации с внешними системами, статус остаётся прежним, что вводит в заблуждение покупателей.
Проверьте следующие моменты, чтобы диагностировать проблему:
- Включено ли управление запасами для товара (вкладка «Инвентарь» в настройках товара)?
- Обновляется ли поле
stock_quantityв базе данных после изменения количества? - Используются ли кастомные поля или сторонние плагины, которые могут влиять на статус товара?
Как автоматически менять статус товара при обновлении склада в WooCommerce
Подключение к хуку обновления товара
Лучший способ — использовать хук woocommerce_update_product или save_post_product для срабатывания функции, проверяющей остаток и меняющей статус наличия.
Пример кода для functions.php темы или кастомного плагина
add_action('woocommerce_update_product', 'auto_update_product_stock_status', 10, 1);
function auto_update_product_stock_status($product_id) {
$product = wc_get_product($product_id);
if (!$product) return;
// Проверяем, включено ли управление запасами
if (!$product->managing_stock()) return;
$stock_qty = $product->get_stock_quantity();
if ($stock_qty > 0) {
$product->set_stock_status('instock');
} else {
$product->set_stock_status('outofstock');
}
$product->save();
}Этот код автоматически меняет статус товара в зависимости от количества на складе при сохранении товара.
Пошаговое внедрение и проверка
- Добавьте приведённый код в файл
functions.phpактивной темы или в кастомный плагин. - Убедитесь, что для товара включено управление запасами (галочка «Управлять запасами?» в настройках товара).
- Измените количество товара в админке WooCommerce и сохраните изменения.
- Проверьте, что после сохранения статус товара изменился на «В наличии» или «Нет в наличии» в зависимости от количества.
- Проверьте на фронтенде: страница товара должна отображать актуальный статус.
Частые ошибки и их исправление
- Код не срабатывает после массового импорта товаров. Многие импортеры используют прямое обновление базы, минуя хуки WordPress. Решение — запускать отдельный скрипт для обновления статусов после импорта или использовать WP CLI.
- Статус не меняется, потому что отключено управление запасами. Проверьте, что для каждого товара стоит галочка «Управлять запасами».
- Статус меняется, но фронтенд не обновляет отображение. Очистите кеш сайта и браузера, проверьте работу плагинов кеширования.
- Ошибка PHP из-за неправильного объекта продукта. Добавьте проверку на существование объекта
$productкак в примере.
Практические советы по безопасности и производительности
- Избегайте выполнения кода при обновлении каждого произвольного поста: используйте специализированные хуки, связанные с продуктами WooCommerce.
- Если у вас большой каталог, рассмотрите пакетную обработку статусов через WP CLI для снижения нагрузки.
- Ограничьте права доступа к изменению остатков, чтобы исключить случайные изменения.
- Для повышения безопасности используйте nonce и проверку capabilities при добавлении кода, если расширяете функционал в админке.
Сравнение вариантов обновления статуса товара
| Метод | Плюсы | Минусы |
|---|---|---|
Использование хука woocommerce_update_product | Автоматическая обработка при сохранении товара, простой код | Не работает при массовых импортах, если они обходят WP хуки |
| WP CLI скрипт для пакетной обработки | Быстрое обновление большого количества товаров, без нагрузки на сайт | Требует доступа к серверу и навыков работы с консолью |
| Плагины для управления запасами | Дополнительные функции, удобство использования | Могут замедлять сайт, требуют обновлений и могут конфликтовать |