Woocommerce программное управление атрибутами
Информация основана на https://stackoverflow.com/questions/53705122/add-a-new-term-to-a-product-attribute-and-set-it-in-the-product-in-woocommerce
В коде происходит следующее:
Указан слаг заранее созданного атрибута, с которым будем работать.
Указано значение атрибута, которое нужно добавить к товару.
Получаем ID этого значения. Если Такого значения не было, то создаем его.
Получаем все атрибуты текущего товара и ищим среди них наш атрибут.
Если такого нет, то создаем и добавляем.
Если есть — то добавляем в него наше значение.
Как-то так
$attribute_slug = 'consist'; // Слаг заранее созданного атрибута. В нем будем работать. В моём случае это состав.
$znacheniename_of_attribute = 'Значение'; // Имя одного из значений этого атрибута
$taxonomy = 'pa_' . $attribute_slug; // The taxonomy
$term_name = $znacheniename_of_attribute; // The term "NAME"
$term_slug = sanitize_title($term_name); // The term "slug"
// Check if the term exist and if not it create it (and get the term ID).
if( ! term_exists( $term_name, $taxonomy ) ){ //Проверяем, существует ли такой значение в указанном атрибуте
// Создаём его, если такого ещё нет
$term_data = wp_insert_term( $term_name, $taxonomy );
// Получаем ID этого значения
$term_id = $term_data['term_id'];
} else {
// Получаем ID этого значения
$term_id = get_term_by( 'name', $term_name, $taxonomy )->term_id;
}
// get an instance of the WC_Product Object
// Получаем отбъект товара
$product = wc_get_product( $post_id );
// Массив атрибутов товара (массив из WC_Product_Attribute)
$attributes = (array) $product->get_attributes();
// 1. If the product attribute is set for the product
if( array_key_exists( $taxonomy, $attributes ) ) { // Если наш атрибут имеется у этого товара
foreach( $attributes as $key => $attribute ){
// $key - таксономия атрибута (с приставкой pa_)
// $attribute - объект WC_Product_Attribute
if( $key == $taxonomy ){ //Если это наш атрибут
$options = (array) $attribute->get_options(); // Получаем массив из ID значений этого атрибута
$options[] = $term_id; // Добавляем туда ещё и наше значение
$attribute->set_options($options); //Применяем новый набор значений к этому атрибуту
$attributes[$key] = $attribute; // Теперь заменяем наш атрибут новым в массиве атрибутов
break;
}
}
$product->set_attributes( $attributes ); //Применяем к товару подкорректированный массив атрибутов
}
// 2. The product attribute is not set for the product
else {
// Если наш атрибут у этого товара отсутствует
// создаем новы атрибут
$attribute = new WC_Product_Attribute();
$attribute->set_id( sizeof( $attributes) + 1 );
$attribute->set_name( $taxonomy );
$attribute->set_options( array( $term_id ) );
$attribute->set_position( sizeof( $attributes) + 1 );
$attribute->set_visible( true );
$attribute->set_variation( false );
$attributes[] = $attribute; // Добавляем к массиву атрибутов - наш
$product->set_attributes( $attributes ); //Применяем к товару подкорректированный массив атрибутов
}
$product->save();
// Append the new term in the product
//х.з. что это
if( ! has_term( $term_name, $taxonomy, $post_id ))
wp_set_object_terms($post_id, $term_slug, $taxonomy, true );
$znacheniename_of_attribute = 'Значение'; // Имя одного из значений этого атрибута
$taxonomy = 'pa_' . $attribute_slug; // The taxonomy
$term_name = $znacheniename_of_attribute; // The term "NAME"
$term_slug = sanitize_title($term_name); // The term "slug"
// Check if the term exist and if not it create it (and get the term ID).
if( ! term_exists( $term_name, $taxonomy ) ){ //Проверяем, существует ли такой значение в указанном атрибуте
// Создаём его, если такого ещё нет
$term_data = wp_insert_term( $term_name, $taxonomy );
// Получаем ID этого значения
$term_id = $term_data['term_id'];
} else {
// Получаем ID этого значения
$term_id = get_term_by( 'name', $term_name, $taxonomy )->term_id;
}
// get an instance of the WC_Product Object
// Получаем отбъект товара
$product = wc_get_product( $post_id );
// Массив атрибутов товара (массив из WC_Product_Attribute)
$attributes = (array) $product->get_attributes();
// 1. If the product attribute is set for the product
if( array_key_exists( $taxonomy, $attributes ) ) { // Если наш атрибут имеется у этого товара
foreach( $attributes as $key => $attribute ){
// $key - таксономия атрибута (с приставкой pa_)
// $attribute - объект WC_Product_Attribute
if( $key == $taxonomy ){ //Если это наш атрибут
$options = (array) $attribute->get_options(); // Получаем массив из ID значений этого атрибута
$options[] = $term_id; // Добавляем туда ещё и наше значение
$attribute->set_options($options); //Применяем новый набор значений к этому атрибуту
$attributes[$key] = $attribute; // Теперь заменяем наш атрибут новым в массиве атрибутов
break;
}
}
$product->set_attributes( $attributes ); //Применяем к товару подкорректированный массив атрибутов
}
// 2. The product attribute is not set for the product
else {
// Если наш атрибут у этого товара отсутствует
// создаем новы атрибут
$attribute = new WC_Product_Attribute();
$attribute->set_id( sizeof( $attributes) + 1 );
$attribute->set_name( $taxonomy );
$attribute->set_options( array( $term_id ) );
$attribute->set_position( sizeof( $attributes) + 1 );
$attribute->set_visible( true );
$attribute->set_variation( false );
$attributes[] = $attribute; // Добавляем к массиву атрибутов - наш
$product->set_attributes( $attributes ); //Применяем к товару подкорректированный массив атрибутов
}
$product->save();
// Append the new term in the product
//х.з. что это
if( ! has_term( $term_name, $taxonomy, $post_id ))
wp_set_object_terms($post_id, $term_slug, $taxonomy, true );
(Просмотрено 1 845 раз, 1 раз за сегодня)