Не получается правильно создать вариацию товаров в woocommerce

я пытаюсь создать вариации товаров на основе размеров пиц:

public function create_sizes_and_prices_variations(WC_Product $product, $prices, $sizes)
    {
        global $wp_taxonomies;

        // 1. Собираем массив "размер => цена"
        $size_map = [];
        foreach ($sizes as $size) {
            $size_map[$size['id']] = [
                'name' => $size['name'],
                'priority' => $size['priority'],
            ];
        }

        $size_prices = [];
        foreach ($prices as $price_obj) {
            $size_id = $price_obj['sizeId'];
            if (isset($size_map[$size_id]) && $price_obj['price']['isIncludedInMenu']) {
                $size_prices[$size_map[$size_id]['name']] = floatval($price_obj['price']['currentPrice']);
            }
        }

        if (empty($size_prices)) {
            return;
        }

        // 2. Создание таксономии для размеров
        $product_slug = sanitize_title($product->get_slug());
        $taxonomy = 'pa_' . $product_slug;

        // Проверяем существует ли таксономия, если нет - создаем
        if (!taxonomy_exists($taxonomy)) {
            $tax_slug_for_attr = wc_attribute_taxonomy_slug($taxonomy); // для правильного slug
            $taxonomy_name = 'pa_' . $tax_slug_for_attr; // фиксируем название таксономии

            // Создаем таксономию, если её нет
            register_taxonomy(
                $taxonomy_name,
                'product_variation',
                [
                    'hierarchical' => false,
                    'label' => 'Размер ' . $product->get_name(),
                    'query_var' => true,
                    'rewrite' => ['slug' => $product_slug . '-size'],
                ]
            );

            $wp_taxonomies[$taxonomy_name] = new WP_Taxonomy($taxonomy_name, 'product', []);
        }

        // 3. Добавление термина (размера)
        $attributes = [];
        $options = [];
        foreach ($size_prices as $size_name => $price) {
            $term_slug = sanitize_title($size_name);

            // Проверяем существование термина
            if (!term_exists($size_name, $taxonomy)) {
                $term_data = wp_insert_term($size_name, $taxonomy, ['slug' => $term_slug]);
                $term = WP_Term::get_instance($term_data['term_id']);
            } else {
                $term = get_term_by('name', $size_name, $taxonomy);
            }

            // Добавляем термины в атрибуты
            if ($term instanceof WP_Term) {
                $options[] = $term->name;

                // Связываем продукт с этим термином
                wp_set_post_terms($product->get_id(), [$term->term_id], $taxonomy, true);
            }
        }

        // 4. Создаем атрибут для продукта
        $attribute = new WC_Product_Attribute();
        $attribute->set_name($taxonomy);
        $attribute->set_options($options);
        $attribute->set_visible(true);
        $attribute->set_variation(true);
        $product->set_attributes([$attribute]);
        $product->save();

        // 5. Создание вариаций на основе цен
        foreach ($size_prices as $size_name => $price) {
            $variation = new WC_Product_Variation();
            $variation->set_parent_id($product->get_id());
            $variation->set_attributes([$taxonomy => $size_name]);
            $variation->set_regular_price($price);
            $variation->save();

            // 6. Связываем термины с вариациями
            $term = get_term_by('name', $size_name, $taxonomy);
            if ($term instanceof WP_Term) {
                // Связываем термины с вариацией
                wp_set_post_terms($variation->get_id(), [$term->term_id], $taxonomy, true);
            }
        }

        // 7. Установим первую вариацию как дефолтную
        $first_size = array_key_first($size_prices);
        if ($first_size) {
            $product->set_default_attributes([
                $taxonomy => $first_size,
            ]);
            $product->save();
        }

        return $product;
    }

но вариации товара не подхватываются, более того taxonomy_exists созданным вариациям всегда возращает false, хотя эти таксономии есть в бд. в чём проблема?


Ответы (0 шт):