Не получается правильно создать вариацию товаров в 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, хотя эти таксономии есть в бд. в чём проблема?