Проблема: нежелательное автоматическое обновление остатков товаров в WooCommerce
Многие магазины на WooCommerce сталкиваются с ситуацией, когда остатки товаров обновляются автоматически по API или внешним скриптам. Это может приводить к ошибочным данным, конфликтам с внутренним учётом и сбоям в отображении доступности товаров. Например, при интеграции с внешним складом или при использовании плагинов для синхронизации запасов.
Диагностика проблемы
- Проверьте, какие плагины или кастомные скрипты работают с WooCommerce REST API — часто именно они обновляют остатки автоматически.
- Посмотрите логи обмена данными (если есть) — там будут запросы на изменение метаполей
_stock,_stock_status. - Проверьте настройки плагинов синхронизации, есть ли там включенные автоматические обновления остатков.
- Если изменения происходят без видимых плагинов — возможно, это кастомный код в functions.php или hooked-обработчики.
Как отключить автоматическое обновление остатков товаров
1. Отключаем обновление через REST API с помощью фильтра
WooCommerce позволяет ограничить доступ к REST API или настроить, какие поля доступны для обновления. Можно запретить изменение поля stock_quantity через API, если это причина проблемы.
add_filter('woocommerce_rest_prepare_product_object', function($response, $object, $request) {
if ($request->get_method() === 'PUT' || $request->get_method() === 'POST') {
$params = $request->get_params();
if (isset($params['stock_quantity'])) {
// Отключаем изменение stock_quantity через API
unset($params['stock_quantity']);
$request->set_param('stock_quantity', null);
}
}
return $response;
}, 10, 3);Однако такой способ не всегда срабатывает — лучше использовать более жёсткий способ через права доступа.
2. Отключаем права на изменение остатков через REST API
Используем хук woocommerce_rest_product_object_update_permissions_check, чтобы запретить обновление остатков:
add_filter('woocommerce_rest_product_object_update_permissions_check', function($permission, $request, $product) {
$params = $request->get_params();
if (isset($params['stock_quantity'])) {
return new WP_Error('rest_forbidden', 'Изменение остатков запрещено', array('status' => 403));
}
return $permission;
}, 10, 3);3. Отключаем автоматическое обновление остатков из плагинов
Если причина в стороннем плагине, ищите в его настройках опцию отключения автоматического обновления запасов. Если такой нет, можно временно деактивировать плагин и проверить, как изменится поведение.
Проверка результата
- Попробуйте изменить остаток товара через REST API вручную (например, с помощью Postman) — изменение должно быть запрещено (ошибка 403).
- Проверьте фронтенд и админку — количество на складе должно оставаться стабильным, без неожиданных изменений.
- Отслеживайте логи сервера, чтобы убедиться, что запросы на обновление остатков не проходят или блокируются.
Частые ошибки и как их исправить
- Код фильтра не срабатывает: Возможно, приоритет хуков конфликтует с другими плагинами. Попробуйте увеличить приоритет, например, до 20.
- Остатки всё равно обновляются: Проверьте, нет ли других мест в коде, которые напрямую вызывают сохранение поля
_stockчерез функцииupdate_post_metaбез проверки прав. - Ошибка 403 мешает легитимным обновлениям: Если блокируете изменение остатков полностью, убедитесь, что это не мешает штатному управлению складом для администраторов — можно добавить проверки на роль пользователя в фильтр.
Практические советы по безопасности и производительности
- Ограничивайте доступ к REST API по ролям и IP, чтобы предотвратить несанкционированное обновление остатков.
- Используйте кеширование и оптимизированные запросы при интеграциях с внешними складскими системами, чтобы избежать перегрузки сервера.
- Ведите логи изменений остатков для быстрого выявления ошибок и нежелательных обновлений.
Сравнение способов отключения автоматического обновления остатков
| Способ | Плюсы | Минусы |
|---|---|---|
| Фильтр доступа к полю stock_quantity через REST API | Простой код, быстро внедряется | Не всегда срабатывает, могут быть обходы |
| Хук проверки прав на обновление продукта | Надёжный, блокирует обновления на уровне API | Может блокировать легитимные обновления, требует доработки под роли |
| Отключение в настройках плагина синхронизации | Без кода, удобное управление | Зависит от функционала плагина, не всегда возможно |