2012-11-14 184 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);