WooCommerce: автоматическое изменение атрибутов товаров через Webhook с примером кода

Проблема: необходимость изменять атрибуты товаров автоматически

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

Диагностика: как проверить, что Webhook и обновление атрибутов работают корректно

  • Убедитесь, что ваш сервер принимает POST-запросы от источника Webhook.
  • Проверьте, что тело запроса содержит необходимые данные: ID товара и новые значения атрибутов.
  • Отладьте обработчик: логируйте входящие данные и ошибки.
  • Проверьте, что атрибуты действительно изменились в админке WooCommerce после срабатывания Webhook.

Пошаговое решение: настройка Webhook и обновление атрибутов

1. Создание обработчика Webhook

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

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

function handle_update_attributes(WP_REST_Request $request) {
    $params = $request->get_json_params();
    if (empty($params['product_id']) || empty($params['attributes'])) {
        return new WP_REST_Response('Missing product_id or attributes', 400);
    }

    $product_id = intval($params['product_id']);
    $attributes_data = $params['attributes'];

    $product = wc_get_product($product_id);
    if (!$product) {
        return new WP_REST_Response('Product not found', 404);
    }

    // Обновляем атрибуты
    $updated = update_product_attributes($product, $attributes_data);
    if ($updated) {
        return new WP_REST_Response('Attributes updated', 200);
    } else {
        return new WP_REST_Response('Failed to update attributes', 500);
    }
}

function update_product_attributes($product, $attributes_data) {
    $attributes = $product->get_attributes();
    
    foreach ($attributes_data as $attribute_name => $values) {
        $taxonomy = wc_sanitize_taxonomy_name($attribute_name);
        if (taxonomy_exists($taxonomy)) {
            // Атрибут таксономия
            $term_slugs = array_map('sanitize_title', $values);
            wp_set_object_terms($product->get_id(), $term_slugs, $taxonomy);
            $attributes[$taxonomy] = new WC_Product_Attribute();
            $attributes[$taxonomy]->set_name($taxonomy);
            $attributes[$taxonomy]->set_options($term_slugs);
            $attributes[$taxonomy]->set_position(0);
            $attributes[$taxonomy]->set_visible(true);
            $attributes[$taxonomy]->set_variation(false);
        } else {
            // Пользовательский атрибут
            $attr = new WC_Product_Attribute();
            $attr->set_name($attribute_name);
            $attr->set_options($values);
            $attr->set_position(0);
            $attr->set_visible(true);
            $attr->set_variation(false);
            $attributes[$attribute_name] = $attr;
        }
    }

    $product->set_attributes($attributes);
    return $product->save();
}

2. Отправка Webhook

Внешняя система должна отправлять POST-запрос на адрес https://your-site.com/wp-json/custom/v1/update-attributes с JSON телом вида:

{
  "product_id": 123,
  "attributes": {
    "pa_color": ["red", "blue"],
    "Material": ["cotton"]
  }
}

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

  • Отправьте тестовый POST-запрос с корректными данными через Postman или curl.
  • В админке WooCommerce откройте товар с ID из запроса и убедитесь, что атрибуты обновились.
  • Проверьте логи ошибок сервера на предмет возможных проблем.
  • Попробуйте получить товар через REST API, чтобы убедиться, что атрибуты изменились и там.

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

  • Ошибка 400 или 404: Неверный ID товара или отсутствуют параметры в запросе. Проверьте формат JSON и наличие всех обязательных полей.
  • Атрибуты не обновляются: Возможно, названия атрибутов не совпадают с зарегистрированными таксономиями. Убедитесь, что для глобальных атрибутов используется префикс pa_ и они созданы в WooCommerce.
  • Ошибка прав доступа: Код использует permission_callback = '__return_true' для упрощения, в продакшене стоит реализовать проверку авторизации Webhook.
  • Неправильный формат значений атрибутов: Значения должны быть массивом строк, даже если один элемент.

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

  • Реализуйте проверку подписи Webhook для защиты от несанкционированных запросов.
  • Добавьте логирование запросов и ошибок для последующего аудита.
  • Кэшируйте часто используемые данные, если обновления идут часто.
  • Обрабатывайте запросы асинхронно, если обновления тяжелые, чтобы не блокировать сайт.

Сравнение вариантов обновления атрибутов товаров

МетодПреимуществаНедостаткиПример использования
Плагин автообновления Простота настройки, поддержка Ограниченная гибкость, может быть дорогим Плагины WooCommerce Import Suite
Webhook + код (наш метод) Максимальная гибкость, автоматизация Нужны навыки программирования, поддержка кода REST API + PHP, пример выше
Ручное редактирование Простота, не требует навыков Небыстро, ошибки при большом объеме Админка WooCommerce
Автоматическое отключение неактивных заказов в WooCommerce
09.06.2026
Автоматическое создание и отправка отзывов в WordPress с помощью WP Robot
13.01.2026
Автоматическое отправление сообщений в Telegram из WordPress
22.12.2025
Как автоматически отображать посты по тегам в WordPress с примерами кода
23.02.2026
Автоматическое создание вариантов товаров WooCommerce по атрибутам через код
02.06.2026