2015-02-19 38 views
5

Chciałbym dodać własne wyrażenie regularne do sprawdzania poprawności numeru telefonu. W moim class-wc-validation.php zmieniłem wyrażenie regularne na moje wymaganie.Niestandardowa weryfikacja pól kasowych WooCommerce

public static function is_phone($phone) { 
    //if (strlen(trim(preg_replace('/[\s\#0-9_\-\+\(\)]/', '', $phone))) > 0) 
    if (strlen(trim(preg_replace('/^[6789]\d{9}$/', '', $phone))) > 0) 
     return false; 

    return true; 
} 

Ale walidacja się nie dzieje. czego mi brakuje?

Odpowiedz

7

Nie widziałem twojego kodu, który łączy je z przepływem transakcji woocommerce. proszę sprawdzić dokumentację na

woocommerce_checkout_process i woocommerce_checkout_order_processed

Ale w twoim przypadku, bardzo sugerują, że go podłączyć na woocommerce_checkout_process

więc umieścić te poniższych kodów na functions.php od kompozycji lub tworzysz własne wtyczki woocommerce i umieszczasz je w kodzie bootstrap.

add_action('woocommerce_checkout_process', 'is_phone'); 

function is_phone() { 
    $phone_number = $_POST['---your-phone-field-name---']; 
    // your function's body above, and if error, call this wc_add_notice 
    wc_add_notice(__('Your phone number is wrong.'), 'error'); 
} 
4

Nie należy edytować pliki wtyczek, bo jeśli zaktualizować plugin cały dostosowanie zostaną utracone, a można użyć haka, aby osiągnąć swój cel . Możesz użyć haka woocommerce_checkout_process, aby zrobić to .

Oto kod:

add_action('woocommerce_checkout_process', 'wh_phoneValidateCheckoutFields'); 

function wh_phoneValidateCheckoutFields() { 
    $billing_phone = filter_input(INPUT_POST, 'billing_phone'); 

    if (strlen(trim(preg_replace('/^[6789]\d{9}$/', '', $billing_phone))) > 0) { 
     wc_add_notice(__('Invalid <strong>Phone Number</strong>, please check your input.'), 'error'); 
    } 
} 

Kod idzie w functions.php akt aktywnego motywu dziecka (lub tematu). Lub też w dowolnych wtyczkowych plikach PHP.

Uwaga: Domyślnie woocommerce używać billing_phone pole wziąć numer telefonu, ale jeśli dostosował go następnie można wymienić billing_phone z nazwy pola.

Mam nadzieję, że to pomoże!

2

W swoim pytaniu mówisz, że zasada walidacji nie działa i myślę, że została napisana w niewłaściwy sposób. Możesz przetestować go w trybie online za pomocą narzędzi regexp, np. Regex101 lub innych.

Aby odpowiedzieć bardziej ogólnie na ten temat, zmieniając zasady walidacji bezpiecznie można zrobić w ten sposób:

zrobić kopię class-wc-validation.php do katalogu tematycznego w your_theme_path/woocommerce/includes/class-wc-validation.php i uczynić dostosowanie do reguł walidacji.

Następnie należy wprowadzić regułę sprawdzania poprawności dla telefonu złożonego w numerze checkout.js. W przeciwnym razie pole będzie zawsze zielone, mimo że jest nieprawidłowe.

Więc moje rozwiązanie było dodanie zwyczaj regularnego Walidator wyrażenie do checkout.js o linii 192:

if ($parent.is('.validate-phone')) { 
      if ($this.val()) { 

       var pattern = new RegExp(/^([0-9\s\/\+\-\#\_\(\)]*)$/); 

       if (! pattern.test($this.val() )) { 
        $parent.removeClass('woocommerce-validated').addClass('woocommerce-invalid woocommerce-invalid-phone'); 
        validated = false; 
       } 
      } 
     } 

oraz swój dostosować.Plik js (w functions.php)

add_action('wp_enqueue_scripts', 'my_checkoutjs_enqueue_scripts', 100); 

function gv_checkoutjs_enqueue_scripts() { 

if (is_checkout()) { 
    wp_deregister_script('wc-checkout'); 
    wp_enqueue_script('wc-checkout', get_template_directory_uri() . '/js/modified_checkout.js', array('jquery', 'woocommerce', 'wc-country-select', 'wc-address-i18n')); 
}} 

Mam nadzieję, że to pomoże!

3

Wystąpił ten sam problem i podążał za tym, co inni powiedzieli tutaj, ale Woocommerce ustawia tylko błędy sprawdzania poprawności po haku woocommerce_checkout_process.

Jednak w najnowszej woocommerce 3.0 (nie wiem, czy to w wersji 2.x), możemy użyć haka woocommerce_after_checkout_validation a następnie zajrzeć do $data param jeśli używasz standardowych pól realizacji transakcji lub jeśli używać $_POST masz niestandardowe pola, które nie są dodawane w standardowy sposób Woocommerce. Przykładowy kod to:

public function validate($data,$errors) { 
    // Do your data processing here and in case of an 
    // error add it to the errors array like: 
     $errors->add('validation', __('Please input that correctly.')); 
} 
add_action('woocommerce_after_checkout_validation', 'validate',10,2); 

Mam nadzieję, że pomoże!