2017-12-18 42 views
1

이것은 내 WooCommerce 주문에 대한 장바구니 항목 메타 추가 & 주문 항목 메타를 추가하는 방법에 대한 플러그인입니다. 처음에 아래의 코드는 입력 유형 = 텍스트에서 잘 작동했습니다. 값과 입력 된 값의 레이블을 반환합니다.WooCommerce에서 장바구니 항목 메타 및 주문 항목 메타로 사용자 정의 필드 추가

type=checkbox으로 변환시 코드는 확인 된 경우 labelvalue="on"을 반환합니다.

확인 된 값 (값을 무시하지 않음)의 값만 으로 반환하고 싶습니다.

더 많은 확인란 옵션을 포함하는 리팩터는 작성된 코드를 줄이는 데 도움이됩니다.

내 코드 :

<?php 
    global $woocommerce, $product, $post; 

     add_action('woocommerce_before_add_to_cart_button', 'add_fields_before_add_to_cart'); 

     function add_fields_before_add_to_cart() { 
      ?> 

      <div class="simple-selects"> 
       <div class="col-md-6"> 
        <h3>Main meals</h3> 
        <p><input type="checkbox" name="mm_chicken_cutlet_bento" id="mm_chicken_cutlet_bento"><?php _e("Chicken Cutlet Bento", "aoim"); ?></p> 
        <p><input type="checkbox" name="mm_roasted_pork_rib_bento" id="mm_roasted_pork_rib_bento"><?php _e("Roasted Pork Rib Bento", "aoim"); ?></p> 
       </div> 
      </div>   

      <?php 
     } 

     /** 
     * Add data to cart item 
     */ 
     add_filter('woocommerce_add_cart_item_data', 'add_cart_item_data', 25, 2); 
     function add_cart_item_data($cart_item_meta, $product_id) { 

      if (isset($_POST ['mm_chicken_cutlet_bento']) && isset($_POST ['mm_roasted_pork_rib_bento'])) { 
       $custom_data = array() ; 
       $custom_data [ 'mm_chicken_cutlet_bento' ] = isset($_POST ['mm_chicken_cutlet_bento']) ? sanitize_text_field ($_POST ['mm_chicken_cutlet_bento']) : "" ; 
       $custom_data [ 'mm_roasted_pork_rib_bento' ] = isset($_POST ['mm_roasted_pork_rib_bento']) ? sanitize_text_field ($_POST ['mm_roasted_pork_rib_bento']): "" ; 
       $cart_item_meta ['custom_data']  = $custom_data ; 
      } 

      return $cart_item_meta; 
     } 

     /** 
     * Display custom data on cart and checkout page. 
     */ 
     add_filter('woocommerce_get_item_data', 'get_item_data' , 25, 2); 
     function get_item_data ($other_data, $cart_item) { 
      if (isset($cart_item [ 'custom_data' ])) { 
       $custom_data = $cart_item [ 'custom_data' ]; 

       $other_data[] = array('name' => 'Chicken Cutlet Bento', 'display' => $custom_data['mm_chicken_cutlet_bento']); 
       $other_data[] = array('name' => 'Roasted Pork Rib Bento', 'display' => $custom_data['mm_roasted_pork_rib_bento']); 
      } 

      return $other_data; 
     } 

     /** 
     * Add order item meta. 
     */ 
     add_action('woocommerce_add_order_item_meta', 'add_order_item_meta' , 10, 2); 
     function add_order_item_meta ($item_id, $values) { 
      if (isset($values [ 'custom_data' ])) { 
       $custom_data = $values [ 'custom_data' ]; 
       wc_add_order_item_meta($item_id, 'Chicken Cutlet Bento', $custom_data['mm_chicken_cutlet_bento']); 
       wc_add_order_item_meta($item_id, 'Roasted Pork Rib Bento', $custom_data['mm_roasted_pork_rib_bento']); 
      } 
     } 

?> 

답변

1

(댓글 관련) 업데이트 :

  • 제한 하나 개의 제품 ID의 기능
  • 모든 체크 박스 값을 추가 혼수 구분 문자열로

이 체크 박스의 레이블 이름 값으로와 "리 팩터가 작성한 코드를 줄이기 위해 도움이 될 것입니다 더 체크 박스 옵션을 포함 할 수 있도록하는"쉽게 얻으려면 난 당신이 키를 설정하는 간단한 기능을 추가 한/각 표시 할 확인란 및 프로세스에 대한 값 쌍 ... 그래서 모든 코드 재 방문했다

:

// HERE set the array of pairs keys/values for your checkboxes 
function custom_checkboxes(){ 
    return array(
     'mm_chicken_cutlet_bento'  => __("Chicken Cutlet Bento", "aoim"), 
     'mm_roasted_pork_rib_bento'  => __("Roasted Pork Rib Bento", "aoim"), 
    ); 
} 

// Displaying the checkboxes 
add_action('woocommerce_before_add_to_cart_button', 'add_fields_before_add_to_cart'); 
function add_fields_before_add_to_cart() { 
    global $product; 
    if($product->get_id() != 2) return; // Only for product ID "2" 

    ?> 
    <div class="simple-selects"> 
     <div class="col-md-6"> 
      <h3><?php _e("Main meals", "aoim"); ?></h3> 
      <?php foreach(custom_checkboxes() as $key => $value): ?> 
       <p><input type="checkbox" name="<?php echo $key; ?>" id="<?php echo $key; ?>"><?php echo ' ' . $value; ?></p> 
      <?php endforeach; ?> 
     </div> 
    </div> 
    <?php 
} 


// Add data to cart item 
add_filter('woocommerce_add_cart_item_data', 'add_cart_item_data', 25, 2); 
function add_cart_item_data($cart_item_data, $product_id) { 
    if($product_id != 2) return $cart_item_data; // Only for product ID "2" 

    // Set the data for the cart item in cart object 
    $data = array() ; 

    foreach(custom_checkboxes() as $key => $value){ 
     if(isset($_POST[$key])) 
      $cart_item_data['custom_data'][$key] = $data[$key] = $value; 
    } 
    // Add the data to session and generate a unique ID 
    if(count($data > 0)){ 
     $cart_item_data['custom_data']['unique_key'] = md5(microtime().rand()); 
     WC()->session->set('custom_data', $data); 
    } 
    return $cart_item_data; 
} 


// Display custom data on cart and checkout page. 
add_filter('woocommerce_get_item_data', 'get_item_data' , 25, 2); 
function get_item_data ($cart_data, $cart_item) { 
    if($cart_item['product_id'] != 2) return $cart_data; // Only for product ID "2" 

    if(! empty($cart_item['custom_data'])){ 
     $values = array(); 
     foreach($cart_item['custom_data'] as $key => $value) 
      if($key != 'unique_key'){ 
       $values[] = $value; 
      } 
     $values = implode(', ', $values); 
     $cart_data[] = array(
      'name' => __("Option", "aoim"), 
      'display' => $values 
     ); 
    } 

    return $cart_data; 
} 

// Add order item meta. 
add_action('woocommerce_add_order_item_meta', 'add_order_item_meta' , 10, 3); 
function add_order_item_meta ($item_id, $cart_item, $cart_item_key) { 
    if (isset($cart_item[ 'custom_data' ])) { 
     $values = array(); 
     foreach($cart_item[ 'custom_data' ] as $key => $value) 
      if($key != 'unique_key'){ 
       $values[] = $value; 
      } 
     $values = implode(', ', $values); 
     wc_add_order_item_meta($item_id, __("Option", "aoim"), $values); 
    } 
} 

이 코드는 활성 자식 테마 (또는 테마)의 function.php 파일에 간다거나 또한 모든 플러그인 파일에서 .

테스트를 거쳐 작동합니다.


이 같은 것을 얻을 것이다 :

enter image description here

내가 값의 반복을 피하기 위해 레이블로, "옵션"을 추가 한 ...

+0

리팩터링은 잘 작동합니다. 추가 할 몇 가지 트윅이 있습니다. 1. 특정 ID가있는 제품에 대한 유일한 제품으로 제한 할 수 있습니까? 2. 이미지로 내 질문을 업데이트했습니다. "확인 된 값의 유일한 값 이름을 반환하고 싶습니다 (값을 무시하지 않음)."라는 의미임을 나타 냈습니다. 쉼표로 구분 된 경우 체크 아웃시 주문 테이블에 표시해야합니다. "치킨 커틀릿 도시락은, 구운 돼지 갈비 도시락, 실시 예 3, 실시 예 4" 내가 가진 질문을 편집 치킨 까스 도시락과 볶은 돼지 고기 갈비 도시락은 옵션으로 선택하는 경우, 그들은 로 주문 테이블 아래에 나열한다 예를 들어 – omukiguy

+0

내 뜻을 나타내는 이미지. – omukiguy

+0

@omukiguy 첫 번째 요청에 대한 코드를 업데이트했습니다 ... 하나의 제품에 대해서만이를 제한합니다. – LoicTheAztec