获取产品变体属性值术语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 
      ) 
     ) 
    ) 
) 
+1

谢谢你的回答,我的问题确实不清楚。我的意思是我想要获取变体ID和名称,但这是不可能的,因为灰色变体的变体ID与灰色变体的变体ID不同。所以我需要做更多的实验来获得理想的结果 – Swolschblauw