Автоматическое изменение цен и наличия товаров WooCommerce через Webhook с примером кода

Что такое Webhook и зачем он нужен для WooCommerce

Webhook — это механизм, позволяющий получать уведомления о событиях от внешних систем в реальном времени. В контексте WooCommerce Webhook часто используется для автоматического обновления информации о товарах, например, цены и наличия, на основе данных из ERP, CRM или складского ПО.

Основное преимущество — автоматизация синхронизации данных без необходимости ручного вмешательства или периодического запуска импорта.

Диагностика проблемы: почему автоматическое обновление цен и остатков критично

Ручное обновление цен и остатков в WooCommerce на крупных магазинах — источник ошибок и временных затрат. Проблемы, которые решает Webhook:

  • Расхождение информации о наличии товара на сайте и в реальном складе.
  • Неактуальные цены из-за задержек обновления.
  • Ошибки при массовом ручном редактировании.

Если вы замечаете, что данные на сайте устарели или нужно срочно реагировать на изменения цен, настройка Webhook — эффективное решение.

Настройка Webhook в WooCommerce для получения обновлений

WooCommerce умеет создавать исходящие Webhook-и, но для приема и обработки входящих уведомлений потребуется написать собственный обработчик. Варианты:

  • Создать REST API endpoint в WordPress.
  • Написать обработчик на отдельном сервере и взаимодействовать с WooCommerce через REST API.

Для задачи автоматического обновления цен и остатков удобно реализовать endpoint внутри WordPress, чтобы сразу менять данные через стандартные функции WooCommerce.

Пример регистрации REST API маршрута для приема Webhook

add_action('rest_api_init', function () {
    register_rest_route('custom/v1', '/update-product', array(
        'methods' => 'POST',
        'callback' => 'handle_product_update_webhook',
        'permission_callback' => '__return_true',
    ));
});

function handle_product_update_webhook(WP_REST_Request $request) {
    $data = $request->get_json_params();
    if (empty($data['sku']) || (!isset($data['price']) && !isset($data['stock']))) {
        return new WP_REST_Response(['error' => 'Invalid data'], 400);
    }

    $product_id = wc_get_product_id_by_sku($data['sku']);
    if (!$product_id) {
        return new WP_REST_Response(['error' => 'Product not found'], 404);
    }

    $product = wc_get_product($product_id);

    if (isset($data['price'])) {
        $product->set_regular_price($data['price']);
    }

    if (isset($data['stock'])) {
        $product->set_stock_quantity((int)$data['stock']);
        $product->set_manage_stock(true);
        $product->set_stock_status($data['stock'] > 0 ? 'instock' : 'outofstock');
    }

    $product->save();

    return new WP_REST_Response(['success' => true], 200);
}

Пошаговое руководство по внедрению автоматического обновления

  1. Добавьте в functions.php темы или в кастомный плагин код для создания REST API маршрута (как в примере выше).
  2. Убедитесь, что у товаров корректно заполнено поле SKU — по нему будет осуществляться поиск.
  3. Настройте в вашей внешней системе отправку POST-запросов с JSON телом типа:
    {
      "sku": "12345",
      "price": "1999",
      "stock": 10
    }
  4. Проверьте, что WordPress принимает запросы по адресу https://ваш-сайт.ru/wp-json/custom/v1/update-product.
  5. При поступлении данных убедитесь, что цена и наличие меняются в админке WooCommerce.

Проверка результата после внедрения

Чтобы проверить работу Webhook:

  • Отправьте тестовый POST-запрос через Postman или curl:
curl -X POST https://ваш-сайт.ru/wp-json/custom/v1/update-product \
-H "Content-Type: application/json" \
-d '{"sku":"test-sku","price":"1500","stock":5}'
  • Зайдите в админку WooCommerce и откройте товар с SKU test-sku.
  • Проверьте, что цена и количество на складе изменились на указанные в запросе.
  • Если изменений нет — проверьте логи ошибок и response сервера.

Частые ошибки и как их исправить

  • Ошибка 404 при вызове API: проверьте, что REST API включен, и ссылка корректна. Возможно, нужен сброс постоянных ссылок (Перейдите в Настройки > Постоянные ссылки и нажмите «Сохранить»).
  • Неверный или пустой SKU: убедитесь, что в JSON передается поле sku и оно соответствует SKU товара в WooCommerce.
  • Права доступа: в примере разрешена публичная обработка (permission_callback = __return_true). В продакшене рекомендуется добавить проверку авторизации (например, по токену в заголовках).
  • При обновлении не сохраняются данные: убедитесь, что вызывается $product->save(); и объект продукта корректно получен.

Практические советы по безопасности и производительности

  • Безопасность: Для ограничения доступа к API добавьте проверку токена в заголовках:
function custom_permission_callback(WP_REST_Request $request) {
    $token = $request->get_header('X-Auth-Token');
    return $token === 'ваш_секретный_токен';
}
  • Добавьте эту функцию в permission_callback вместо __return_true.
  • Производительность: При большом количестве обновлений используйте очереди (например, через Action Scheduler), чтобы избежать блокировки.
  • Логируйте входящие запросы и ошибки в отдельный файл для отладки.

Сравнение способов автоматического обновления цен и остатков

МетодПлюсыМинусыКод/Плагин
Webhook + REST API обработчик (код)Мгновенное обновление, гибкость, контрольНужны навыки разработки, безопасностьПример в статье
Плагины синхронизации (например, WooCommerce Stock Sync)Простота установки, готовые функцииМожет не покрывать все сценарии, нагрузкаClearfy Pro помогает оптимизировать сайт после установки плагинов
Периодический импорт CSV/XMLПростота реализации, массовое обновлениеЗадержка обновления, нагрузка на серверПлагины типа WP All Import
Автоматическое создание вариантов товаров WooCommerce по атрибутам через код
02.06.2026
Как автоматически обновлять контент в WordPress с помощью AJAX и WP-Cron
02.01.2026
Как автоматически отключить и включить плагин в WordPress с помощью кода
27.03.2026
Как создать автоматический импорт продуктов в WordPress с помощью WP All Import
25.12.2025
Как автоматически отключить Emoji в WordPress с помощью кода
18.01.2026