2017-11-22 6 views
1

Woocommerceのチェックアウト画面で特定の国が選択されている場合にのみ、必要に応じて電話を表示する必要があります(必須)。選択した国をリアルタイムで確認する検証ルールは何ですか?Wooocommerceの一部の特定の国ではチェックアウト電話のフィールドは不要です

私は以下のコードは、ほとんどのjQueryを使用している...あなたは、ほとんどリアルタイムイベントやクライアント側でのライブイベントのためにJavaScriptを使用する必要が

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

を必要と電話以外を作るために働いている次のコードを、試してみましたそして、顧客が特定の国を選択した場合のみ必要課金電話を作るためにPHPのビット、:

// 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ファイルになりますか。

テスト済みで動作します。

+0

偉大な答え、それは素晴らしいです! –

関連する問題