创建 WooCommerce 产品变体会添加一个空属性值
Creating WooCommerce product variation adds an empty attribute value
向 WooCommerce 产品添加变体时,它会添加一个空白属性。这意味着当我尝试添加自己的属性时,它会附加到现有数组中。
示例代码我是运行ning:
$product_variation = wc_get_product( $variation_id );
$product_variation->set_attributes(array('attribute_pa_varinfo' => 'blue'));
$product_variation->save();
然后当我 var_dump($product_variation);
我得到以下信息:
["attributes"]=>
array(2) {
[0]=>
string(0) ""
["pa_varinfo"]=>
string(4) "5034"
}
因此,当我在 WooCommerce 管理员中查看产品时,我的所有变体都在那里,但所有变体的属性都停留在 "any option"。
奇怪的是,当我 "update" 来自 wp-admin 的所有变体的产品然后选择了正确的属性时。
有没有人以前遇到过这种情况或对我能做什么有任何想法?
再举一个例子,如果我 运行 以下内容:
$product_variation = wc_get_product( $variation_id );
$product_variation->set_attributes( array ( 'simon' => 'confused' ) );
$product_variation->save();
var_dump($product_variation->get_attributes());
这个returns:
array(2) {
[0]=> string(0) ""
["simon"]=> string(8) "confused"
}
第一项来自哪里?我似乎无法清除它。
更新 (与您的更新和评论相关)
To resume (our comments): The product attribute exist. Also all terms for this attribute are defined and set in the parent variable product (in the "Attribute" settings tab)
我做了一些测试:
- 我创建了一个新的“Varinfo”属性 (
pa_varinfo
),其中包含 4 个值(术语名称):
104 mm
、110 mm
、130 mm
和 140 mm
(所以术语 slug 就像 104-mm
…).
- 我创建了一个新的可变产品,其中有一个空变体(没有为此变体定义)并更改保存 select 字段显示:
使用此代码时(与您的类似):
$parent_product = wc_get_product( 738 ); // Get the variable product
$variation_ids = $parent_product->get_children(); // Get all children variations (Here only one)
// Iterating through each variation
foreach( $variation_ids as $variation_id ){
$variation = wc_get_product($variation_id);
$variation->set_attributes(array('pa_varinfo' => '104-mm'));
$variation->save();
}
it's just working for me and I get the selected value in backend for this variation:
请注意,我正在为属性使用 分类名称 和 术语 SLUG在数组中…
所以我不知道你哪里做错了…
当您设置不存在的属性项时会发生这种情况 and/or 未注册为父变量产品的 post 项。你可以试试这个:
// Get an instance of the WC_Product_Variation object
$variation = wc_get_product( $variation_id );
// Initialising variables
$taxonomy = 'pa_varinfo'; // The taxonomy
$term_name = 'Blue'; // The term "NAME"
// Check if the term exist and if not we create it.
if( ! term_exists( $term_name, $taxonomy ) )
wp_insert_term( $term_name, $taxonomy );
// Get an instance of the WP_Term object
$term = get_term_by( 'name', $term_name, $taxonomy );
// Get the post terms names from the parent variable product.
$post_term_names = wp_get_post_terms( $variation->get_parent_id(), $taxonomy, array('fields' => 'names') );
// Check if the post term exist and if not we set it in the parent variable product.
if( ! in_array( $term_name, $post_term_names ) )
wp_set_post_terms( $variation->get_parent_id(), $term_name, $taxonomy, true );
// Now you can set the term for the attribute in your variation
$variation->set_attributes( array( $taxonomy => $term->slug ) );
$variation->save(); // Registering the data
// Get an instance of the parent WC_Product_Variable object
$parent_product = wc_get_product( $variation->get_parent_id() );
// Sync the data of the variation in the parent variable product
$parent_product->sync( $variation_id );
这已经过测试并且有效
假设您已经在 WooCommerce 中创建了附加属性……,您将得到:
所以事实证明问题出在针对主要父产品的属性的实际设置,我正在传递一个未命名的数组,通过添加 wc_attribute_taxonomy_name('varinfo') =>
(下面的第 2 行)这正确地保存了数据并删除我的空白数组。
$product_attributes = array(
wc_attribute_taxonomy_name('varinfo') =>
array (
'name' => wc_attribute_taxonomy_name( 'varinfo' ), // set attribute name
'value' => '', // set attribute values
'position' => 1,
'is_visible' => 1,
'is_variation' => 1,
'is_taxonomy' => 1
)
);
update_post_meta($post_id, '_product_attributes', $product_attributes);
向 WooCommerce 产品添加变体时,它会添加一个空白属性。这意味着当我尝试添加自己的属性时,它会附加到现有数组中。
示例代码我是运行ning:
$product_variation = wc_get_product( $variation_id );
$product_variation->set_attributes(array('attribute_pa_varinfo' => 'blue'));
$product_variation->save();
然后当我 var_dump($product_variation);
我得到以下信息:
["attributes"]=>
array(2) {
[0]=>
string(0) ""
["pa_varinfo"]=>
string(4) "5034"
}
因此,当我在 WooCommerce 管理员中查看产品时,我的所有变体都在那里,但所有变体的属性都停留在 "any option"。
奇怪的是,当我 "update" 来自 wp-admin 的所有变体的产品然后选择了正确的属性时。
有没有人以前遇到过这种情况或对我能做什么有任何想法?
再举一个例子,如果我 运行 以下内容:
$product_variation = wc_get_product( $variation_id );
$product_variation->set_attributes( array ( 'simon' => 'confused' ) );
$product_variation->save();
var_dump($product_variation->get_attributes());
这个returns:
array(2) {
[0]=> string(0) ""
["simon"]=> string(8) "confused"
}
第一项来自哪里?我似乎无法清除它。
更新 (与您的更新和评论相关)
To resume (our comments): The product attribute exist. Also all terms for this attribute are defined and set in the parent variable product (in the "Attribute" settings tab)
我做了一些测试:
- 我创建了一个新的“Varinfo”属性 (
pa_varinfo
),其中包含 4 个值(术语名称):104 mm
、110 mm
、130 mm
和140 mm
(所以术语 slug 就像104-mm
…). - 我创建了一个新的可变产品,其中有一个空变体(没有为此变体定义)并更改保存 select 字段显示:
使用此代码时(与您的类似):
$parent_product = wc_get_product( 738 ); // Get the variable product
$variation_ids = $parent_product->get_children(); // Get all children variations (Here only one)
// Iterating through each variation
foreach( $variation_ids as $variation_id ){
$variation = wc_get_product($variation_id);
$variation->set_attributes(array('pa_varinfo' => '104-mm'));
$variation->save();
}
it's just working for me and I get the selected value in backend for this variation:
请注意,我正在为属性使用 分类名称 和 术语 SLUG在数组中…
所以我不知道你哪里做错了…
当您设置不存在的属性项时会发生这种情况 and/or 未注册为父变量产品的 post 项。你可以试试这个:
// Get an instance of the WC_Product_Variation object
$variation = wc_get_product( $variation_id );
// Initialising variables
$taxonomy = 'pa_varinfo'; // The taxonomy
$term_name = 'Blue'; // The term "NAME"
// Check if the term exist and if not we create it.
if( ! term_exists( $term_name, $taxonomy ) )
wp_insert_term( $term_name, $taxonomy );
// Get an instance of the WP_Term object
$term = get_term_by( 'name', $term_name, $taxonomy );
// Get the post terms names from the parent variable product.
$post_term_names = wp_get_post_terms( $variation->get_parent_id(), $taxonomy, array('fields' => 'names') );
// Check if the post term exist and if not we set it in the parent variable product.
if( ! in_array( $term_name, $post_term_names ) )
wp_set_post_terms( $variation->get_parent_id(), $term_name, $taxonomy, true );
// Now you can set the term for the attribute in your variation
$variation->set_attributes( array( $taxonomy => $term->slug ) );
$variation->save(); // Registering the data
// Get an instance of the parent WC_Product_Variable object
$parent_product = wc_get_product( $variation->get_parent_id() );
// Sync the data of the variation in the parent variable product
$parent_product->sync( $variation_id );
这已经过测试并且有效
假设您已经在 WooCommerce 中创建了附加属性……,您将得到:
所以事实证明问题出在针对主要父产品的属性的实际设置,我正在传递一个未命名的数组,通过添加 wc_attribute_taxonomy_name('varinfo') =>
(下面的第 2 行)这正确地保存了数据并删除我的空白数组。
$product_attributes = array(
wc_attribute_taxonomy_name('varinfo') =>
array (
'name' => wc_attribute_taxonomy_name( 'varinfo' ), // set attribute name
'value' => '', // set attribute values
'position' => 1,
'is_visible' => 1,
'is_variation' => 1,
'is_taxonomy' => 1
)
);
update_post_meta($post_id, '_product_attributes', $product_attributes);