web-dev-qa-db-ja.com

製品バリエーションの属性値

Woocommerceの製品バリエーションとその属性に関して大きな問題に直面しています。利用可能な各製品バリエーションの各属性を含むテーブルを表示しようとしています。しかし、Woocommerceは属性を小文字で完全にポストメタに保存し、スラッシュとü、ö、äなどのドイツ語の特殊文字を置き換えます。属性は$ variation-> get_variation_attributes()で取得します。たとえば管理パネルのドロップダウンに表示される保存値をデータベースで検索しましたが、割り当てられているバリエーションへのリンクなしで次のように保存されます。

a:5:{s:10:"bestell-nr";a:6:{s:4:"name";s:11:"Bestell-Nr.";s:5:"value";s:9:"1 | 2 | and so on...

表示する正しい形式で属性を取得するにはどうすればよいですか?

ご協力いただきありがとうございます!

7
user3357332

実際には、製品属性は実際にはカスタム分類法の用語であるため、その特定の分類法の用語を取得する必要があります。すべての属性分類法の前には「pa_」が付いています。したがって、サイズ属性は「pa_size」分類法になります。また、バリエーションIDは、バリエーションの投稿IDです。

ただし、表示方法に応じて、WooCommerceにはバリエーションのすべての属性を表示するための組み込み関数があります。

以下に、すべてのバリエーション属性の定義リストを表示します。

echo wc_get_formatted_variation( $product->get_variation_attributes() );

そして、trueの2番目のパラメーターを渡すと、フラットリストが表示されます。

echo wc_get_formatted_variation( $product->get_variation_attributes(), true );
12
helgatheviking

これは私にとってはうまくいくようです。お役に立てれば。

$post = get_post();
$id =  $post->ID;
$product_variations = new WC_Product_Variable( $id );
$product_variations = $product_variations->get_available_variations();
print_r($product_variations);

これはclass-wc-product-variable.phpにあります

したがって、基本的にそのページを見回すと、便利な関数がたくさん見つかります。

これが私がまとめたものです。

 $product_children = $product_variations->get_children();

 $child_variations = array();

 foreach ($product_children as $child){

 $child_variations[] = $product_variations->get_available_variation($child);

 }

 print_r($child_variations);

すべてではなく、バリエーション属性の1つだけを公開したかったのです。他の誰かに役立つ場合に備えて、このコードを提供してください。

get_variation_attributes()はすべての属性を取得します

wc_get_formatted_variation()は、渡された配列のフォーマットされたバージョンを返します

$attributes =  $productVariation->get_variation_attributes() ;
if ( $attributes [ 'attribute_pa_colour' ] ) {
    $colour = [ 'attribute_pa_colour' => $attributes [ 'attribute_pa_colour'] ];
    echo wc_get_formatted_variation ( $colour );
}
3
piersb

私がそれを行う方法は、「get_post_meta」を使用することです。

echo get_post_meta( $variation_id, 'attribute_name_field', true);

これが誰かを助けることを願っています。

1
john

ちょうどこれを通過しました...これが私の解決策です。複数の属性とすべてのバリエーションを処理します。あなたはただ属性スラッグを知っている必要があります。

 $items  = $order->get_items();     
 foreach( $items as $item_id => $product ) 
 {  
 $ProductName = $product->get_name();        /

 if($product->is_type( 'simple' ))
   $CoreProductName = $ProductName;             // No variance   
 else
   {
   list($CoreProductName, $ThrowAway) = explode(" - ",$ProductName, 2); 

   $variation_id       = $product['variation_id'];
   $variation          = new WC_Product_Variation($variation_id);
   $attributes         = $variation->get_variation_attributes();
   $SelectedAttribute1 = $attributes['attribute_YOUR_SLUG1_PER_PRODUCT'];
   $SelectedAttribute2 = $attributes['attribute_YOUR_SLUG2_PER_PRODUCT'];
  }
 }
0
Debbie Kurth

wp_get_post_termsを使用して、正しい分散属性を取得しました。

    global $product;
    $variations = $product->get_available_variations();
    $var = [];
    foreach ($variations as $variation) {
        $var[] = $variation['attributes'];
    }
    var_dump($var);
    //xxx to get attribute values with correct lower-upper-mixed-case
    foreach ($var as $key => $arr) {
      foreach ($arr as $orig_code => $lowercase_value) {
        $terms_arr = wp_get_post_terms( $product->id, str_replace('attribute_','',$orig_code), array( 'fields' => 'names' ) );
        foreach ($terms_arr as $term) {
            if (strtolower($term) == $lowercase_value) {
                $var[$key][$orig_code] = $term;
                break;
            }
        }
      }
    }
    var_dump($var);

結果:

ハードコードの前

array (size=1)
  0 => 
    array (size=2)
      'attribute_pa_width' => string 'none' (length=4)
      'attribute_pa_code' => string 'valancese' (length=9)

ハードコード後:

array (size=1)
  0 => 
    array (size=2)
      'attribute_pa_width' => string 'None' (length=4)
      'attribute_pa_code' => string 'ValanceSe' (length=9)
0