获取产品变体属性值术语ID和名称
问题描述:
在WooCommerce中,我使用$product->get_variation_attributes()
来获取产品的变体属性。这个函数返回一个没有ID的名字的数组。获取产品变体属性值术语ID和名称
像这样:
[pa_color-shirt] => Array
(
[0] => red
[7] => grey
[14] => yellow
)
[pa_color-sweater] => Array
(
[0] => red
[1] => green
[2] => blue
[3] => grey
[4] => yellow
[5] => pink
[6] => dark-blue
)
对于AJAX店我创造我还需要从变化了的ID。 因此,我可以将ID和名称附加到选择框(就像woocommerce一样)。
我搜索了几天但找不到解决方案。
我创造了这个代码:
if($product->has_child()) {
$attributes = $product->get_attributes();
$variations = $product->get_available_variations();
$variationsArray = array();
foreach ($attributes as $attr => $attr_deets) {
$variationArray = array();
$attribute_label = wc_attribute_label($attr);
$variationArray["attribute_label"] = $attribute_label;
if (isset($attributes[$attr]) || isset($attributes['pa_' . $attr])) {
$attribute = isset($attributes[$attr]) ? $attributes[$attr] : $attributes['pa_' . $attr];
if ($attribute['is_taxonomy'] && $attribute['is_visible']) {
$variationArray["attribute_name"] = $attribute['name'];
$variationIds = array();
$variationNames = array();
$variationPrices = array();
foreach ($variations as $variation) {
if (!empty($variation['attributes']['attribute_' . $attribute['name']])) {
array_push($variationIds, $variation['variation_id']);
$taxonomy = $attribute['name'];
$meta = get_post_meta($variation['variation_id'], 'attribute_'.$taxonomy, true);
$term = get_term_by('slug', $meta, $taxonomy);
$variation_name = $term->name;
array_push($variationNames, $variation_name);
array_push($variationPrices, $variation['display_regular_price']);
}
}
$variationArray["variation_prices"] = $variationPrices;
$variationArray["variations"] = array_combine($variationIds, $variationNames);
}
}
array_push($variationsArray, $variationArray);
}
}
$product_variations = $variationsArray;
此代码返回https://hastebin.com/ecebewumoz.php
代码的作品,但返回重复姓名和身份证的。
我的问题是否有人知道我可以如何完成相同的get_variation_attributes()
,但与ID的?
感谢。
答
更新WooCommerce版本3+
foreach($product->get_variation_attributes() as $taxonomy => $terms_slug){
// To get the attribute label (in WooCommerce 3+)
$taxonomy_label = wc_attribute_label($taxonomy, $product);
// Setting some data in an array
$variations_attributes_and_values[$taxonomy] = array('label' => $taxonomy_label);
foreach($terms_slug as $term){
// Getting the term object from the slug
$term_obj = get_term_by('slug', $term, $taxonomy);
$term_id = $term_obj->term_id; // The ID <== <== <== <== <== <== HERE
$term_name = $term_obj->name; // The Name
$term_slug = $term_obj->slug; // The Slug
// $term_description = $term_obj->description; // The Description
// Setting the terms ID and values in the array
$variations_attributes_and_values[$taxonomy]['terms'][$term_id] = array(
'name' => $term_name,
'slug' => $term_slug
);
}
}
下面WooCommerce版本3
我看不出有任何重复的ID变化原始数据阵列...你的问题不是很清楚,所以很难猜测到什么是失踪的Ids哟你在看。然后我冒这个险来回答,我想,这些失踪的ID从属性值术语IDS ...
为了得到这个条款的ID,我使用WordPress的功能get_term_by()
,这种方式:
foreach($product->get_variation_attributes() as $taxonomy => $terms_slug){
// To get the taxonomy object
$taxonomy_obj = get_taxonomy($taxonomy);
$taxonomy_name = $taxonomy_obj->name; // Name (we already got it)
$taxonomy_label = $taxonomy_obj->label; // Label
// Setting some data in an array
$variations_attributes_and_values[$taxonomy] = array('label' => $taxonomy_obj->label);
foreach($terms_slug as $term){
// Getting the term object from the slug
$term_obj = get_term_by('slug', $term, $taxonomy);
$term_id = $term_obj->term_id; // The ID <== <== <== <== <== <== HERE
$term_name = $term_obj->name; // The Name
$term_slug = $term_obj->slug; // The Slug
// $term_description = $term_obj->description; // The Description
// Setting the terms ID and values in the array
$variations_attributes_and_values[$taxonomy]['terms'][$term_id] = array(
'name' => $term_name,
'slug' => $term_slug
);
}
}
而且用:
echo '<pre>'; print_r($variations_attributes_and_values);echo '</pre>';
我会得到这样的输出,与用于为变型产品的每个属性的实质的ID (我已经安排阵列输出得到它更紧凑):
Array(
[pa_color] => Array(
[label] => Color
[terms] => Array(
[8] => Array(
[name] => Black
[slug] => black'
)
[9] => Array(
[name] => Blue
[slug] => blue
)
[11] => Array(
[name] => Green
[slug] => green
)
)
)
[pa_bulk_quantity] => Array(
[label] => Bulk quantity
[terms] => Array(
[44] => Array(
[name] => Pack of 10 dozen
[slug] => pack-of-10-dozen
)
[45] => Array(
[name] => Case of 50 dozens
[slug] => case-of-50-dozens
)
)
)
)
谢谢你的回答,我的问题确实不清楚。我的意思是我想要获取变体ID和名称,但这是不可能的,因为灰色变体的变体ID与灰色变体的变体ID不同。所以我需要做更多的实验来获得理想的结果 – Swolschblauw