Автоматическое обновление остатка и цены товаров WooCommerce через Webhook

Диагностика проблемы с обновлением товаров в WooCommerce

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

Типичные симптомы:

  • Цены и остатки не совпадают с данными поставщика.
  • Ручное обновление занимает много времени.
  • Невозможно быстро реагировать на изменения в ассортименте.

Что такое Webhook и как он помогает с обновлением WooCommerce

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

Преимущества использования webhook:

  • Мгновенное обновление данных без опроса.
  • Минимум нагрузки на сервер.
  • Гибкость: можно обновлять любые поля товара.

Пошаговое решение: настройка обработки webhook для автоматического обновления

1. Создаем кастомный API-эндпоинт в WooCommerce

Добавим в functions.php или в кастомный плагин следующий код для обработки входящих webhook-запросов:

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

function custom_update_product_callback(WP_REST_Request $request) {
    $params = $request->get_json_params();

    if (empty($params['sku'])) {
        return new WP_Error('no_sku', 'SKU не передан', array('status' => 400));
    }

    $sku = sanitize_text_field($params['sku']);
    $price = isset($params['price']) ? floatval($params['price']) : null;
    $stock = isset($params['stock']) ? intval($params['stock']) : null;

    $product_id = wc_get_product_id_by_sku($sku);
    if (!$product_id) {
        return new WP_Error('product_not_found', 'Товар с таким SKU не найден', array('status' => 404));
    }

    $product = wc_get_product($product_id);

    if ($price !== null) {
        $product->set_price($price);
        $product->set_regular_price($price);
    }

    if ($stock !== null) {
        $product->set_stock_quantity($stock);
        $product->set_stock_status($stock > 0 ? 'instock' : 'outofstock');
    }

    $product->save();

    return array('success' => true, 'product_id' => $product_id);
}

2. Отправка webhook-запроса из внешней системы

Пример запроса на обновление товара с SKU "ABC123" с помощью curl:

curl -X POST https://example.com/wp-json/custom/v1/update-product \
  -H 'Content-Type: application/json' \
  -d '{"sku":"ABC123","price":1999.99,"stock":25}'

3. Безопасность: добавляем проверку секретного ключа

Для защиты эндпоинта добавим проверку заголовка с секретным ключом:

register_rest_route('custom/v1', '/update-product', array(
    'methods' => 'POST',
    'callback' => 'custom_update_product_callback',
    'permission_callback' => function ($request) {
        $secret = $request->get_header('X-Webhook-Secret');
        return $secret === 'your_secret_key';
    },
));

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

Чтобы убедиться, что обновление прошло успешно:

  • Отправьте POST-запрос на ваш эндпоинт с тестовыми данными.
  • Проверьте изменение цены и остатков в админке WooCommerce.
  • Включите WP_DEBUG и проверьте логи на ошибки при отправке данных.

Частые ошибки и способы их исправления

  • Ошибка 404 «Товар с таким SKU не найден»: убедитесь, что SKU действительно существует и совпадает с регистром.
  • Ошибка 400 «SKU не передан»: проверьте формат JSON и наличие обязательного поля sku.
  • Ошибка 401 или 403: неверный или отсутствующий секретный ключ в заголовках.
  • Данные не обновляются: проверьте, что WooCommerce активен, и вызовы методов set_price(), set_stock_quantity() корректны.

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

  • Используйте HTTPS для защиты передачи данных.
  • Ограничьте доступ к API по IP, если это возможно.
  • Добавьте логирование успешных и неудачных запросов для аудита.
  • Для больших объемов обновлений используйте пакетную обработку или очереди, чтобы избежать таймаутов.

Сравнение способов обновления WooCommerce товаров

МетодПлюсыМинусыПример
Webhook + REST APIМгновенное обновление, гибкость, безопасностьТребует настройки, программированияКод выше
Плагины синхронизацииУпрощают интеграцию, готовые решенияМогут быть тяжелыми, платнымиWP All Import, WooCommerce Stock Synchronization
CRON с опросом APIПростота реализации при отсутствии webhookЗадержка обновлений, нагрузка на серверWP-Cron + wp_remote_get()
Как автоматически создать выбор из вариантов в WordPress с помощью пользовательских полей и AJAX
03.02.2026
Автоматическое отправление сообщений в Telegram из WordPress
22.12.2025
Автоматическое изменение цен и наличия товаров WooCommerce через Webhook с примером кода
10.05.2026
Автоматическое создание категорий и подкатегорий в WordPress с помощью кода
10.04.2026
Автоматическое отключение неиспользуемых виджетов в WordPress
05.06.2026