2012-11-14 179 views
34

我正在尝试获取产品自定义属性值,但我很失败。 我试图如何从WooCommerce获取产品自定义属性

global $woocommerce, $post, $product; 
$res = get_post_meta($product->id); 
print_r(unserialize($res['_product_attributes'][0])); 

但是我却越来越

[pa_koostis] => Array 
     (
      [name] => pa_koostis 
      [value] => 
      [position] => 0 
      [is_visible] => 1 
      [is_variation] => 0 
      [is_taxonomy] => 1 
     ) 

我知道,有一个价值,因为它显示了它的属性一节,但我只是不能找到一个方法来得到它显示在我的自定义代码。

回答

58

编辑: 作为2.1 woocommerce_get_product_terms不赞成

去以下为datafeedr在HES写道回答:

global $product; 
$koostis = array_shift(wc_get_product_terms($product->id, 'pa_koostis', array('fields' => 'names'))); 

global $product; 
$koostis = $product->get_attribute('pa_koostis'); 

原来的答复:

$result = array_shift(woocommerce_get_product_terms($product->id, 'pa_koostis', 'names')); 
+1

谢谢你的回答,这真的很有帮助。 –

+1

可以请你检查这个https://stackoverflow.com/questions/47766480/woocommerce-custom-shop-page-with-infinte-load –

12

,你可以得到下面的代码属性的单值:

$pa_koostis_value = get_post_meta($product->id, 'pa_koostis', true); 
+1

为让所有任何想法属性一次所有属性? – ravisoni

+2

@ravisoni'get_post_meta($ prodict-> id,'_product_attributes');' – EHerman

10

woocommerce_get_product_terms()现在已经过时了。

改为使用wc_get_product_terms()

例子:

global $product; 
$koostis = array_shift(wc_get_product_terms($product->id, 'pa_koostis', array('fields' => 'names'))); 
+5

这是正确的。我相信在2.1版中一切都被软化了。 – helgatheviking

+0

我得到了 - >注意:只有变量应该通过引用传递。 Woocommerce版本3.2.6。代码---> $ date = array_shift(wc_get_product_terms($ product-> get_id(),'pa_date',array('fields'=>'names')));什么可能是错误的?我无法解决它。 gettype($ date)'Null' – Kristis

8

最新:

$product->get_attribute('your_attr'); 

您需要定义$product如果不是在页面上。

8

尝试使用此方法获得的属性名称=>属性值(一个或多个)的数组:

global $product; 

$formatted_attributes = array(); 

$attributes = $product->get_attributes(); 

foreach($attributes as $attr=>$attr_deets){ 

    $attribute_label = wc_attribute_label($attr); 

    if (isset($attributes[ $attr ]) || isset($attributes[ 'pa_' . $attr ])) { 

     $attribute = isset($attributes[ $attr ]) ? $attributes[ $attr ] : $attributes[ 'pa_' . $attr ]; 

     if ($attribute['is_taxonomy']) { 

      $formatted_attributes[$attribute_label] = implode(', ', wc_get_product_terms($product->id, $attribute['name'], array('fields' => 'names'))); 

     } else { 

      $formatted_attributes[$attribute_label] = $attribute['value']; 
     } 

    } 
} 

//print_r($formatted_attributes); 

return $formatted_attributes; 

这有点低效,但不会把戏。

9

更新2016年可以使用:

global $product; 
echo $product->list_attributes(); 

自定义输出,复制plugins/woocommerce/templates/single-product/product-attributes.phpthemes/theme-child/woocommerce/single-product/product-attributes.php和修改。

+1

它对我来说真的很有用..谢谢David –

1

您将获得的属性阵列中的“$ formatted_attributes”

  $attributes = $product->get_attributes(); 

      foreach($attributes as $attr=>$attr_deets){ 

       $attribute_label = wc_attribute_label($attr); 

       if (isset($attributes[ $attr ]) || isset($attributes[ 'pa_' . $attr ])) { 

        $attribute = isset($attributes[ $attr ]) ? $attributes[ $attr ] : $attributes[ 'pa_' . $attr ]; 

        if ($attribute['is_taxonomy']) { 

         $formatted_attributes[$attribute_label] = wc_get_product_terms($product->id, $attribute['name']); 

        } else { 

         $formatted_attributes[$attribute_label] = $attribute['value']; 
        } 

       } 
      } 


      print_r($formatted_attributes); 
+0

这段代码适用于我,但我在一行中获取了所有现有的属性值。 如何回显每个标签中的每个属性值? – Kristis

0

该解决方案提供了这个问题的是2.1,你应该在woocommerce 3个工作更新此代码。0,否则庞大的日志将被生成自嘲下面的代码

+0

您应该提供解决方案或对以前的答案发表评论,因为您的答案不会为该主题添加任何价值。 – bokorben

0

用它来获得与细节

global $wpdb; 

    $attribute_taxonomies = $wpdb->get_results("SELECT * FROM " . $wpdb->prefix . "woocommerce_attribute_taxonomies WHERE attribute_name != '' ORDER BY attribute_name ASC;"); 
    set_transient('wc_attribute_taxonomies', $attribute_taxonomies); 

    $attribute_taxonomies = array_filter($attribute_taxonomies ) ; 

    prin_r($attribute_taxonomies);