2016-11-30 5 views
1

지정된 범주의 제품이있는 경우에만이 사용자 정의 필드를 표시해야합니다. 그런 다음 필드 만 필요합니다.정의 된 제품 범주에 대한 결제 청구 필드 설정 해제. 장바구니 항목 만 독점적으로

아래 코드는 단지 표시하도록 설정되어 있습니다 : none 필드는 실제로 체크 아웃을 클릭하면 "myfield 필드가 필요합니다"라는 오류가 있지만 표시를 설정하지 않으려면 필드를 제거해야합니다. .

제발 뭐라하니?

나는 최신 버전의 WooCommerce가 있습니다. 또한 다른 카테고리가있는 경우 필요에 따라

/** 
* Add the field to the checkout 
*/ 
add_filter('woocommerce_checkout_fields' , 'custom_override_checkout_fields'); 

// Our hooked in function - $fields is passed via the filter! 
function custom_override_checkout_fields($fields) { 
    $fields['billing']['my_field_name'] = array(
    'label'  => __('Codice medico', 'woocommerce'), 
    'placeholder' => _x('Inserisci il codice del tuo medico', 'placeholder', 'woocommerce'), 
    'required' => true, 
    'class'  => array('form-row-wide'), 
    'clear'  => true 
    ); 

    return $fields; 
} 

/** 
* Process the checkout 
*/ 
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process'); 

function my_custom_checkout_field_process() { 
    // Check if set, if its not set add an error. 
    if (! $_POST['my_field_name']) 
     wc_add_notice(__('<h4 style="color:red;">Stai acquistando un prodotto per cui è necessaria la prescrizione medica. Per favore inserisci il codice del tuo medico per proseguire. Grazie.</h4>'), 'error'); 
} 

/** 
* Update the order meta with field value 
*/ 
add_action('woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta'); 

function my_custom_checkout_field_update_order_meta($order_id) { 
    if (! empty($_POST['my_field_name'])) { 
     update_post_meta($order_id, 'Codice Medico', sanitize_text_field($_POST['my_field_name'])); 
    } 
} 

/** 
* Display field value on the order edit page 
*/ 
add_action('woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1); 

function my_custom_checkout_field_display_admin_order_meta($order){ 
    echo '<p><strong>'.__('Codice Medico').':</strong> ' . get_post_meta($order->id, 'Codice Medico', true) . '</p>'; 
} 

/* Adding Custom Fields to Emails 
1. Add this snippet to your theme's functions.php file 
2. Change the meta key names in the snippet 
3. Create a custom field in the order post - e.g. key = "Tracking Code" value = abcdefg 
4. When next updating the status, or during any other event which emails the user, they will see this field in their email 
*/ 
add_filter('woocommerce_email_order_meta_keys', 'my_custom_order_meta_keys'); 

function my_custom_order_meta_keys($keys) { 
    $keys[] = 'Codice Medico'; // This will look for a custom field called 'Tracking Code' and add it to emails 
    return $keys; 
} 


/** 
* Conditionally remove checkout fields 
*/ 
add_filter('woocommerce_checkout_fields' , 'conditional_unset_checkout_field'); 
function conditional_unset_checkout_field($fields) { 

    $categories = array('prodotti-in-polvere-e-bustine', 'gel-e-creme', 'prodotti-in-capsule', 'prodotti-plantari', 'prodotti-liquidi', 'area-riservata'); 
    $has_cat = false; 

    // Iterating through each cart items (products) 
    foreach(WC()->cart->get_cart() as $cart_item){ 

     // Iterating through each category in your array 
     foreach($categories as $category){ 

      if (has_term($category, 'product_cat', $cart_item['product_id'])) { 
       $has_cat = true; 
       break; 
      } 
     } 
     if ($has_cat) break; 
    } 

    // If one of the categories is in one cart item, we unset the field 
    if ($has_cat) { 
     unset($fields['billing']['my_field_name']); 
    } 
    return $fields; 
} 

답변

2

가, 카트 항목에 정의 된 범주가있을 경우에만 필드를 설정 해제하고,하지 :

내 코드입니다.

첫째 : 당신은 이 어제 질문에 내 대답 코드를 작업 여기에 사용됩니다

Remove a checkout field if cart items are from some specific product categories

당신은 여기 언급하지 않았다. 그 후

, 나는 on this test server (일부 미성년자의 수정을) 코드를 테스트했으며, 을 그것은 예상대로 완벽한 작업입니다! '포스터'카테고리에있는 상점 '플라잉 닌자'의 첫 번째 제품을 추가하면 맞춤 체크 아웃 입력란이 원하는대로 제거됩니다. 장바구니에서 '플라잉 닌자'를 제거하고 예를 들어 2 번째 제품인 '해피언'을 추가하면

/** 
* Add the field to the checkout 
*/ 
add_filter('woocommerce_checkout_fields' , 'custom_override_checkout_fields'); 

// Our hooked in function - $fields is passed via the filter! 
function custom_override_checkout_fields($fields) { 
    $fields['billing']['my_field_name'] = array(
     'label'  => __('Codice medico', 'woocommerce'), 
     'placeholder' => _x('Inserisci il codice del tuo medico', 'placeholder', 'woocommerce'), 
     'required' => true, 
     'class'  => array('form-row-wide'), 
     'clear'  => true 
    ); 

    return $fields; 
} 

/** 
* Process the checkout 
*/ 
add_action('woocommerce_checkout_process', 'custom_checkout_field_process'); 

function custom_checkout_field_process() { 
    // Check if set, if its not set add an error. 
    if (! $_POST['my_field_name']) 
     wc_add_notice(__('<h4 style="color:red;">Stai acquistando un prodotto per cui è necessaria la prescrizione medica. Per favore inserisci il codice del tuo medico per proseguire. Grazie.</h4>'), 'error'); 
} 

/** 
* Update the order meta with field value 
*/ 
add_action('woocommerce_checkout_update_order_meta', 'custom_checkout_field_update_order_meta'); 

function custom_checkout_field_update_order_meta($order_id) { 
    $my_field_name = $_POST['my_field_name']; 
    if (!empty($my_field_name)) 
     update_post_meta($order_id, 'Codice Medico', sanitize_text_field($my_field_name)); 
} 

/** 
* Display field value on the order edit page 
*/ 
add_action('woocommerce_admin_order_data_after_billing_address', 'display_custom_checkout_field_in_admin_order_meta', 10, 1); 

function display_custom_checkout_field_in_admin_order_meta($order){ 
    echo '<p><strong>'.__('Codice Medico').':</strong> ' . get_post_meta($order->id, 'Codice Medico', true) . '</p>'; 
} 

/** 
* Conditionally remove checkout fields 
*/ 
add_filter('woocommerce_checkout_fields' , 'conditional_unset_checkout_field'); 
function conditional_unset_checkout_field($fields) { 

    $categories = array('prodotti-in-polvere-e-bustine', 'gel-e-creme', 'prodotti-in-capsule', 'prodotti-plantari', 'prodotti-liquidi', 'area-riservata', 'posters'); 
    $has_cat = false; 
    $has_other_cat = false; 

    // Iterating through each cart items (products) 
    foreach(WC()->cart->get_cart() as $cart_item){ 
     // Getting the item product categories 
     $item_categories = wp_get_post_terms($cart_item['product_id'], 'product_cat'); 
     foreach($item_categories as $item_category){ 
      if(in_array($item_category->slug, $categories)) 
       $has_cat = true; 
      else 
       $has_other_cat = true; 
     } 
    } 

    // If one of your defined categories is in the cart item 
    // and not the others categories, we unset the field 
    if ($has_cat && !$has_other_cat) { 
     unset($fields['billing']['my_field_name']); 
    } 
    return $fields; 
} 
: '포스터'카테고리에없는 닌자는 "사용자 정의 필드는 가볍게 변경된 코드 즉 ... 다시

를 표시합니다