Что такое хук wc_update_product_stock и зачем он нужен?
Хук wc_update_product_stock в WooCommerce вызывается при обновлении количества товара на складе. Это позволяет разработчикам запускать дополнительные действия в момент изменения остатков, например, синхронизировать данные с внешними сервисами, обновлять пользовательский интерфейс или запускать уведомления.
Диагностика проблемы: почему автоматическое обновление остатков не срабатывает?
Если вы добавили обработчик на wc_update_product_stock, но он не вызывается, проверьте следующие моменты:
- Вы используете правильный хук. В WooCommerce есть похожие хуки, например:
woocommerce_update_product_stockилиwoocommerce_product_set_stock. - Обновление остатков происходит через функции, которые не вызывают данный хук (например, прямое изменение метаполей без вызова API WooCommerce).
- Код обработчика подключён слишком рано или поздно — лучше подключать на
plugins_loadedили позже.
Пошаговое решение: как правильно использовать хук wc_update_product_stock
Рассмотрим пример, как добавить логирование изменения остатка товара с помощью wc_update_product_stock.
add_action('wc_update_product_stock', 'custom_handle_stock_update', 10, 1);
function custom_handle_stock_update($product) {
if (!$product instanceof WC_Product) {
return;
}
$stock_quantity = $product->get_stock_quantity();
$product_id = $product->get_id();
// Пример: логируем изменение в файл
error_log("Product ID {$product_id} stock updated. New stock: {$stock_quantity}");
}Обратите внимание, что хук передаёт объект WC_Product, что удобно для получения данных товара.
Как обновлять остаток программно с вызовом хука
Чтобы гарантировать срабатывание хука, используйте wc_update_product_stock() или методы класса WC_Product с последующим вызовом сохранения.
// Получаем продукт
$product = wc_get_product(123);
// Устанавливаем новое количество
$product->set_stock_quantity(10);
// Обновляем статус наличия
$product->set_stock_status($product->get_stock_quantity() > 0 ? 'instock' : 'outofstock');
// Сохраняем - вызовет хук wc_update_product_stock
$product->save();Проверка результата после внедрения
Чтобы проверить, что ваш обработчик сработал, сделайте следующее:
- Обновите остаток товара через админку WooCommerce.
- Проверьте логи PHP (например,
error_log) на наличие строк с обновлением остатков. - Если вы запускаете синхронизацию с внешним сервисом — убедитесь, что данные пришли корректно.
Частые ошибки и как их исправить
- Хук не вызывается при изменении остатков: возможно, вы меняете метаполя напрямую через
update_post_meta— такой способ не вызывает хук. Используйте методыWC_Product. - Неверный приоритет подключения хука: если ваш код подключается слишком рано, объект
WC_Productможет быть недоступен. - Обработчик принимает неправильное количество параметров: убедитесь, что функция-обработчик принимает именно объект
WC_Productи указан правильный параметр вadd_action.
Практические советы по безопасности и производительности
- Не делайте тяжелых операций (например, сетевые запросы) непосредственно внутри обработчика хука. Вместо этого используйте
wp_cronили отложенную обработку черезAction Scheduler. - Если логируете данные, не забывайте очищать логи или использовать отдельный файл для удобства и безопасности.
- При массовом обновлении остатков (например, импорт товаров) отключайте лишние хуки или используйте флаги, чтобы избежать избыточных вызовов.
Сравнение вариантов обновления остатков в WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
Использование WC_Product->set_stock_quantity() и save() | Гарантированное срабатывание хуков, корректное обновление статуса | Требует загрузки объекта, может быть медленнее при массовом обновлении |
Прямое обновление метаполей update_post_meta() | Быстрее при массовом обновлении | Не вызывает хуки WooCommerce, возможна неконсистентность данных |
Использование функции wc_update_product_stock() | Упрощённый вызов, вызов нужных хуков | Менее гибкий, чем методы объекта |