Woocommerce: не добавляется атрибут к продукту

Я делаю кастомный импорт продуктов. В начале скрипта я создаю глобальные атрибуты:

private function createAttribute($attribute)
{
    $attributes = array_values(wc_get_attribute_taxonomy_labels());

    if (!in_array($attribute, $attributes)) {
        wc_create_attribute([
            'name' => $attribute,
            'slug' => IM_Helper::translit($attribute)
        ]);
    }
}

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

$attributes_array = array();
foreach ($this->properties as $property) {
    $attribute = $this->createAttribute($property);
    $attributes_array[] = $attribute;
}

$product->set_attributes($attributes_array);

$product->save();
private function createAttribute($property)
{
    $attribute_id = wc_attribute_taxonomy_id_by_name($property['name']);
    $attribute = new WC_Product_Attribute();
    $attribute->set_id($attribute_id);
    $attribute->set_name( 'pa_'.$property['name'] );
    $attribute->set_visible( true );
    $attribute->set_variation( false );
    $attribute->set_options([$property['value']]);

    return $attribute;
}

После выполнения скрипта добавляются глобальные атрибуты, добавляются атрибуты продукта. Но значения атрибутов остаются пустыми. При повторном импорте, когда есть глобальные атрибуты, все работает хорошо.

Первый импорт

global attribute product attribute

Повторный импорт

global attribute product attribute


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

Автор решения: Максим Жукович

После создания глобального атрибута его нужно зарегистрировать. Так как это происходит автоматически в начале создания страницы, глобальные атрибуты при повторной загрузке срабатывают.

private function createAttribute($attribute)
{
    $attributes = array_values(wc_get_attribute_taxonomy_labels());

    if (!in_array($attribute, $attributes)) {
        wc_create_attribute([
            'name' => $attribute,
            'slug' => IM_Helper::translit($attribute)
        ]);
    }

    register_taxonomy( 'pa_'.IM_Helper::translit($attribute), 'product');
}
→ Ссылка