WooCommerce: как отключить автоматическое обновление остатков товаров

Проблема: нежелательное автоматическое обновление остатков товаров в 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Может блокировать легитимные обновления, требует доработки под роли
Отключение в настройках плагина синхронизацииБез кода, удобное управлениеЗависит от функционала плагина, не всегда возможно
⭐⭐⭐⭐⭐