2016-10-04 13 views
4

私は助けてください... コードは単一の製品ページで、サイズの入力を表示します(これはバックエンドではリピータフィールドの複数選択)色のチェックボックス(バックエンドではリピータフィールドでの選択)にアタッチされていれば、acfリピータフィールドによって呼び出されます。各色は複数のサイズに関連付けることができます。最初の関数はうまくいき、私が望むものが表示されます。しかし、カスタムメタ製品としてカート内に表示するための結果を取得することはできません(製品のバリエーションとして)。私が間違っている場所を教えてください。おかげでたくさん、私は迷ってしまいました... :-(ここ は、試験製品です:http://neo2.agencepoint.com/boutique/t-shirt-col-rond-manches-courtes-femme/ACFリピータフィールド付きカートにカスタム製品メタを表示

add_action('woocommerce_before_add_to_cart_button', 'add_custom_fields'); 
function add_custom_fields() { 
    global $product; 
    $product_id = $product->id; 
    if(get_field('tailles_et_couleurs', $product_id)): 
     while(has_sub_field('tailles_et_couleurs', $product_id)): 
      $select_couleur = get_sub_field_object('couleurs', $product_id); 
      $valeur_couleur = get_sub_field('couleurs', $product_id); 
      $select_taille = get_sub_field_object('tailles', $product_id); 
      $valeur_taille = get_sub_field('tailles', $product_id); 
      foreach($select_couleur['choices'] as $key_couleur => $nom_couleur): 
       if($key_couleur == $valeur_couleur): 
        echo '<div class="conteneur_taille_couleur"><label class="label-couleur label-couleurs-meta-'.$key_couleur.'" for="couleurs-meta-'.$key_couleur.'"> <input id="couleurs-meta-'.$key_couleur.'" name="'.$key_couleur.'" data-type="palettes" type="checkbox" value="'.$nom_couleur.'"><div class="palette-box" id="palette_couleur_'.$key_couleur.'"></div><div class="nom-couleur nom-couleur-couleurs-meta-'.$key_couleur.'">'.$nom_couleur.'</div></label>'; 
       endif; 
      endforeach; 
      foreach($select_taille['choices'] as $key_taille => $nom_taille): 
       if (in_array($key_taille, $valeur_taille)): 
        echo '<div class="conteneur_taille"><label for="'.$key_taille.'">'.$nom_taille.'</label><input class="quantite_prdt" type="text" name="'.$key_taille.'" id="'.$key_taille.'" data-type="text" ></div>'; 
       endif; 
      endforeach; 
      echo '</div>'; 
     endwhile; 
    endif; 
} 


add_action('woocommerce_add_cart_item_data', 'save_my_custom_product_field', 10, 2); 
function save_my_custom_product_field($cart_item_data, $product_id) { 
    while(has_sub_field('tailles_et_couleurs', $product_id)): 
     $select_couleur = get_sub_field_object('couleurs', $product_id); 
     $valeur_couleur = get_sub_field('couleurs', $product_id); 
     $select_taille = get_sub_field_object('tailles', $product_id); 
     $valeur_taille = get_sub_field('tailles', $product_id); 
     foreach($select_couleur['choices'] as $key_couleur => $nom_couleur): 
      if($key_couleur == $valeur_couleur): 
       $cart_item_data[$key_couleur] = $valeur_couleur; 
       $cart_item_data['unique_key'] = md5(microtime().rand()); 
      endif; 
     endforeach; 
     foreach($select_taille['choices'] as $key_taille => $nom_taille): 
      if (in_array($key_taille, $valeur_taille)): 
       $cart_item_data[$key_taille] = $valeur_taille; 
       $cart_item_data['unique_key'] = md5(microtime().rand()); 
      endif; 
     endforeach; 
    endwhile; 

    return $cart_item_data; 
} 
add_filter('woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 10, 2); 
function render_meta_on_cart_and_checkout($cart_data, $cart_item) { 
    if($cart_item['variation_id'] == 0){ 
     $item_id = $cart_item['product_id']; 
    } 
    else 
    { 
     $item_id = $cart_item['variation_id']; 
    } 
    $custom_items = array(); 
    if(!empty($cart_data)): 
     $custom_items = $cart_data; 
    endif; 
    while(has_sub_field('tailles_et_couleurs', $product_id)): 
     $select_couleur = get_sub_field_object('couleurs', $product_id); 
     $valeur_couleur = get_sub_field('couleurs', $product_id); 
     $select_taille = get_sub_field_object('tailles', $product_id); 
     $valeur_taille = get_sub_field('tailles', $product_id); 
     foreach($select_couleur['choices'] as $key_couleur => $nom_couleur): 
      if($key_couleur == $valeur_couleur): 
       if(isset($cart_item[$nom_couleur])): 
        $custom_items[] = array("name" => $nom_couleur, "value" => $cart_item[$valeur_couleur]); 
       endif; 
      endif; 
     endforeach; 
     foreach($select_taille['choices'] as $key_taille => $nom_taille): 
      if (in_array($key_taille, $valeur_taille)): 
       if(isset($cart_item[$nom_taille])): 
        $custom_items[] = array("name" => $nom_taille, "value" => $cart_item[$valeur_taille]); 
       endif; 
      endif; 
     endforeach; 
    endwhile; 

    return $custom_items; 
} 

答えて

1

私は答えを見つけました!上の私のバリエーションを表示する

add_action('woocommerce_add_cart_item_data', 'save_my_custom_product_field', 10, 2); 
function save_my_custom_product_field($cart_item_data, $product_id,$key_couleur,$variation_id) { 
    while(has_sub_field('tailles_et_couleurs', $product_id)): 
     $select_couleur = get_sub_field_object('couleurs', $product_id); 
     $valeur_couleur = get_sub_field('couleurs', $product_id); 
     $select_taille = get_sub_field_object('tailles', $product_id); 
     $valeur_taille = get_sub_field('tailles', $product_id); 
     // $cart_item_data['couleurs_selectionnees']=array(); 
     $cart_item_data['tailles_couleurs']=array(); 
     if(isset($_POST[$valeur_couleur])){ 
      foreach($select_couleur['choices'] as $key_couleur => $nom_couleur): 
       if(($key_couleur == $valeur_couleur) && (isset($_POST[$valeur_couleur]))): 
        $macouleur=$_REQUEST[$key_couleur]; 
         $cart_item_data['couleurs_selectionnees'][$valeur_couleur] = $macouleur; 
       endif; 
       foreach($select_taille['choices'] as $key_taille => $nom_taille): 
        if($key_taille != 'qte'){ 
         $key_couleur_et_taille = $key_couleur.'_'.$key_taille; 
         $nom_couleur_et_taille = $nom_couleur.' Taille '.$nom_taille; 
         if ((isset($_POST[$key_couleur_et_taille])) && (!empty($_POST[$key_couleur_et_taille]))): 
           $qty_taille=$_REQUEST[$key_couleur_et_taille]; 
           $cart_item_data['tailles_couleurs'][$nom_couleur_et_taille] = $qty_taille; 
         endif; 
        }else{ 
         $key_couleur_et_taille = $key_couleur.'_'.$key_taille; 
         $nom_couleur_et_taille = $nom_couleur; 
         if ((isset($_POST[$key_couleur_et_taille])) && (!empty($_POST[$key_couleur_et_taille]))): 
           $qty_taille=$_REQUEST[$key_couleur_et_taille]; 
           $cart_item_data['tailles_couleurs'][$nom_couleur_et_taille] = $qty_taille; 
         endif; 
        } 
       endforeach; 
      endforeach; 
     }else{ 
      foreach($select_taille['choices'] as $key_taille => $nom_taille): 
        if($key_taille != 'qte'){ 
         $key_couleur_et_taille = $key_couleur.'_'.$key_taille; 
         $nom_couleur_et_taille = $nom_couleur.' Taille '.$nom_taille; 
         if ((isset($_POST[$key_couleur_et_taille])) && (!empty($_POST[$key_couleur_et_taille]))): 
           $qty_taille=$_REQUEST[$key_couleur_et_taille]; 
           $cart_item_data['tailles_couleurs'][$nom_couleur_et_taille] = $qty_taille; 
         endif; 
        } 
       endforeach; 
     } 
    endwhile; 
    return $cart_item_data; 
} 

第三に、機能:顧客がカートに製品を追加したときに、ここで結果を保存する機能があり、

add_action('woocommerce_before_add_to_cart_button', 'add_custom_fields'); 
function add_custom_fields($key_couleur) { 
    global $product; 
    $product_id = $product->id; 
    if(get_field('tailles_et_couleurs', $product_id)): 
     while(has_sub_field('tailles_et_couleurs', $product_id)): 
      $select_couleur = get_sub_field_object('couleurs', $product_id); 
      $valeur_couleur = get_sub_field('couleurs', $product_id); 
      $select_taille = get_sub_field_object('tailles', $product_id); 
      $valeur_taille = get_sub_field('tailles', $product_id); 
      if($valeur_couleur){ 
      foreach($select_couleur['choices'] as $key_couleur => $nom_couleur): 
       if($key_couleur == $valeur_couleur): 
        $couleuralaligne=str_replace(" (","<br>(",$nom_couleur); 
        echo '<div class="conteneur_taille_couleur"><label class="label-couleur label-couleurs-meta-'.$key_couleur.'" for="couleurs-meta-'.$key_couleur.'"> <input id="couleurs-meta-'.$key_couleur.'" name="'.$key_couleur.'" data-type="palettes" type="checkbox" value="'.$nom_couleur.'"><div class="palette-box" id="palette_couleur_'.$key_couleur.'"></div><div class="nom-couleur nom-couleur-couleurs-meta-'.$key_couleur.'">'.$couleuralaligne.'</div></label>'; 
        foreach($select_taille['choices'] as $key_taille => $nom_taille): 
         if (in_array($key_taille, $valeur_taille)): 
          $key_couleur_et_taille = $key_couleur.'_'.$key_taille; 
          echo '<div class="conteneur_taille"><label for="'.$key_couleur_et_taille.'">'.$nom_taille.'</label><input class="quantite_prdt" type="text" name="'.$key_couleur_et_taille.'" id="'.$key_couleur_et_taille.'" data-type="text" ></div>'; 
          $_SESSION['valeur_couleur']=$key_couleur_et_taille; 
         endif; 
        endforeach; 
       endif; 
      endforeach; 
      }else{ 
      foreach($select_taille['choices'] as $key_taille => $nom_taille): 
       if (in_array($key_taille, $valeur_taille)): 
        $key_couleur_et_taille = $key_couleur.'_'.$key_taille; 
        echo '<div class="conteneur_taille"><label for="'.$key_couleur_et_taille.'">'.$nom_taille.'</label><input class="quantite_prdt" type="text" name="'.$key_couleur_et_taille.'" id="'.$key_couleur_et_taille.'" data-type="text" ></div>'; 
        $_SESSION['valeur_couleur']=$key_couleur_et_taille; 
       endif; 
      endforeach; 
      } 
      echo '</div>'; 
     endwhile; 
    endif; 
} 

を次に:まず、私はACリピータから来た私の入力を追加しますカート:

add_filter('woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 10, 2); 
function render_meta_on_cart_and_checkout($cart_data, $cart_item,$product_id,$key_couleur) { 
    $custom_items = array(); 
    if(!empty($cart_data)) { 
     $custom_items = $cart_data; 
    }       
    $qty_input_taille = $cart_item['tailles_couleurs']; 
    if((isset($cart_item['couleurs_selectionnees'])) && (empty($qty_input_taille)) ) { 
     $couleurselect =$cart_item['couleurs_selectionnees']; 
     foreach($couleurselect as $key => $value){ 
      $custom_items[] = array("name" => 'Couleur', "value" => $value); 
     } 
    }else if(!empty($qty_input_taille) ) { 
     $valeurtaille =$cart_item['tailles_couleurs']; 
     foreach($valeurtaille as $key => $value){ 
      $custom_items[] = array("name" => $key, "value" => $value); 
     } 
    } 
    return $custom_items; 
} 

そして最後に、ここにchackoutの私の変化を表示する機能であり、あなたのページ(および電子メールの注文確認を)感謝:

function tshirt_order_meta_handler($item_id, $values, $cart_item_key) { 
    $qty_input_taille = $values['tailles_couleurs']; 
    if((isset($values['couleurs_selectionnees'])) && (empty($qty_input_taille)) ) { 
     $couleurselect =$values['couleurs_selectionnees']; 
     foreach($couleurselect as $key => $value){ 
      wc_add_order_item_meta($item_id, 'Couleur ', $value); 
     } 
    }else if(!empty($qty_input_taille) ) { 
     $valeurtaille =$values['tailles_couleurs']; 
     foreach($valeurtaille as $key => $value){ 
      wc_add_order_item_meta($item_id, $key, $value); 
     } 
    } 
} 
add_action('woocommerce_add_order_item_meta', 'tshirt_order_meta_handler', 1, 3); 
1

あなたのコード内のあなたの主な問題点はどこにでも右product IDを取得している

最初の選択肢は、これを使用することです:

あなたは2の選択肢を持っているプロダクトIDを取得するために引っ掛かり、あなたの最初の関数で

1)

add_action('woocommerce_before_add_to_cart_button', 'add_custom_fields'); 
function add_custom_fields() { 
    global $product; 
    $product_id = $product->id; // Here you really get the product ID 

    if(get_field('tailles_et_couleurs', $product_id)): 

    // . . . 
    // And you will replace everywhere in this function $_product->id by $product_id 

} 

それとも、get_the_id()により、すべての$_product->id出現を置き換えるもWordPressの機能get_the_id()を使用することができます。

function save_my_custom_product_field($cart_item_data, $product_id) { 

ですから、あなたに直接どこでも変数$product_id代わりの$_product->id


3)を使用することができます:あなたが持っているあなたの第二の機能で


2) 3番目と最後の機能は、あなたが持っているように$cart_itemあなたはカートitem IDをこのように得るためにそれを使用します。

add_filter('woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 10, 2); 
function render_meta_on_cart_and_checkout($cart_data, $cart_item) { 
    if($cart_item['variation_id'] == 0) 
     $item_id = $cart_item['product_id']; 
    else 
     $item_id = $cart_item['variation_id']; 

    // Your code goes here replacing everywhere $_product->id by $item_id 
関連する問題