【问题标题】:Display custom product meta in cart with acf repeater fields使用 acf 转发器字段在购物车中显示自定义产品元数据
【发布时间】:2017-02-12 14:11:04
【问题描述】:

我需要帮助... 这是代码,在单个产品页面中,它显示尺寸的输入(在后端,这是中继器字段中的多选)附加到颜色复选框(在后端,这是中继器字段中的选择),它们被称为通过 acf 转发器字段。每种颜色都可以与多种尺寸相关联。第一个功能运行良好,它显示了我想要的。但是我无法检索结果以将它们作为自定义元产品(作为产品变体)显示在购物车中,你能告诉我我哪里错了吗?非常感谢,我迷路了... :-( 这是测试产品:http://neo2.agencepoint.com/boutique/t-shirt-col-rond-manches-courtes-femme/

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;
}

【问题讨论】:

    标签: php wordpress woocommerce advanced-custom-fields


    【解决方案1】:

    您的代码中的主要问题是在任何地方获取正确的product ID

    1) 在您第一个获取产品 ID 的函数中,您有 2 个选择:

    第一选择是使用这个:

    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
    
    }
    

    或者您也可以使用 WordPress 函数 get_the_id() 将所有 $_product-&gt;id 替换为 get_the_id()


    2) 在您的第二个功能中,您有:

    function save_my_custom_product_field( $cart_item_data, $product_id ) {
    

    所以你可以在任何地方直接使用变量 $product_id 而不是 $_product-&gt;id


    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
    

    【讨论】:

      【解决方案2】:

      我找到了答案!首先,我添加来自交流中继器的输入:

      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;
      }
      

      然后,这里是当客户将产品添加到购物车时保存结果的功能:

      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_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;
      }
      

      最后,这里是显示我在退出页面和感谢页面(以及电子邮件订单确认)上的变化的功能:

      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 );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-28
        • 2018-07-16
        • 1970-01-01
        • 1970-01-01
        • 2017-09-28
        • 2016-10-30
        • 2021-07-24
        相关资源
        最近更新 更多