2017-11-22 3 views
1

Woocommerce 결제 화면에서 특정 국가를 선택한 경우에만 필수 전화 번호를 표시해야합니다 (필수). 선택한 국가를 실시간으로 확인할 수있는 유효성 검사 규칙은 무엇입니까?Woocommerce의 일부 특정 국가의 경우 결제 전화 필드가 필요하지 않습니다.

나는

add_filter('woocommerce_billing_fields', 'wc_npr_filter_phone', 10, 1); 

function wc_npr_filter_phone($address_fields) { 
$address_fields['billing_phone']['required'] = false; 
return $address_fields; 
} 

답변

1

당신은 대부분 실시간 이벤트 나 ... 아래 코드는 주로 jQuery를 사용하고 클라이언트 측에서 라이브 이벤트에 대한 자바 스크립트를 사용할 필요가 필요한 전화 비를 만들기 위해 노력하고 다음 코드를 시도했다 어떤 플러그인 파일도

// Making the billing phone field not required (by default) 
add_filter('woocommerce_billing_fields', 'filter_billing_phone_field', 10, 1); 
function filter_billing_phone_field($fields) { 
    $fields['billing_phone']['required'] = false; 
    return $fields; 
} 

// Real time country selection actions 
add_action('woocommerce_after_order_notes', 'custom_checkout_scripts_and_fields', 10, 1); 
function custom_checkout_scripts_and_fields($checkout) { 
    $required = esc_attr__('required', 'woocommerce'); 

    // HERE set the countries codes (2 capital letters) in this array: 
    $countries = array('UK', 'BE', 'GE', 'IT', 'ES'); 

    // Hidden field for the phone number validation 
    echo '<input type="hidden" name="billing_phone_check" id="billing_phone_check" value="0">'; 
    $countries_str = "'".implode("', '", $countries)."'"; // Formatting countries for jQuery 
    ?> 
    <script type="text/javascript"> 
     (function($){ 
      var required = '<abbr class="required" title="<?php echo $required; ?>">*</abbr>', 
       countries = [<?php echo $countries_str; ?>], 
       location = $('#billing_country option:selected').val(), 
       phoneCheck = 'input#billing_phone_check'; 

      function actionRequire(actionToDo='yes', selector=''){ 
       if (actionToDo == 'yes') { 
        $(selector).addClass("validate-required"); 
        $(selector+' label').append(required); 
       } else { 
        $(selector).removeClass("validate-required"); 
        $(selector+' label > .required').remove(); 
       } 
       $(selector).removeClass("woocommerce-validated"); 
       $(selector).removeClass("woocommerce-invalid woocommerce-invalid-required-field"); 
      } 

      // Default value when loading 
      actionRequire('no','#billing_phone_field'); 
      if($.inArray(location, countries) >= 0 && $(phoneCheck).val() == '0'){ 
       actionRequire('yes','#billing_phone_field'); 
       $(phoneCheck).val('1'); 
      } 

      // Live value 
      $('form.checkout').on('change', '#billing_country', function(){ 
       var location = $('#billing_country option:selected').val(); 
       if ($.inArray(location, countries) >= 0 && $(phoneCheck).val() == 0) { 
        actionRequire('yes','#billing_phone_field'); 
        $(phoneCheck).val('1'); 
       } else if ($(phoneCheck).val() == 1) { 
        actionRequire('no','#billing_phone_field'); 
        $(phoneCheck).val('0'); 
       } 
      }); 
     })(jQuery); 
     </script> 
    <?php 
} 

// Phone number validation, when it's visible 
add_action('woocommerce_checkout_process', 'billing_phone_field_process'); 
function billing_phone_field_process() { 
    // Check if set, if its not set add an error. 
    if (! $_POST['billing_phone'] && $_POST['billing_phone_check'] == '1') 
     wc_add_notice(__('Please enter a number phone.'), 'error'); 
} 

코드 활성 자식 테마 (또는 테마)의 function.php 파일에 가거나 : 및 PHP의 비트, 결제 고객이 특정 국가를 선택한 경우에만 필요한 전화를 확인합니다.

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

+0

위대한 답변, 정말 멋지다! –

관련 문제