Intereting Posts
Предупреждение: mysqli_select_db () ожидает ровно 2 параметра, 1 задано * 13 * Удалить символы мусора в utf Как скрыть конкретный URL страницы веб-сайта из поисковых систем? Zend form bootstrap annotation datepicker «Объект, предоставленный помощнику Escape, но флаги не позволяют рекурсию» Предупреждение: mysql_fetch_array (): предоставленный аргумент не является допустимым результатом MySQL в строке 40 Отправка строковых данных в файл PHP на сервере: строка не отправляется? Создание веб-интерфейса для Android-приложения с использованием API-интерфейсов Android. Как отслеживать время пользователя на сайте Доступ к нескольким иностранным полям в виртуальном поле? Формат номера PHP require / include в переменную mysqli подготовленный оператор не может читать unicode Моя почта SMTP продолжает поступать как Junk Android: как сделать мой извлеченный (из mysql) анализируемые данные JSON, добавленные в ListView, обновить его каждую минуту Проблема с выполнением файла bash

Пользовательская проверка полей проверки WooCommerce

Я хотел бы добавить собственное регулярное выражение для проверки номера телефона. В моем class-wc-validation.php я изменил регулярное выражение на мое требование.

 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; } 

Но проверки не происходит. Что мне не хватает?

    Я не видел ваш код, который перехватывает их до потока проверки woocommerce. проверьте их документацию на

    woocommerce_checkout_process и woocommerce_checkout_order_processed

    Но в вашем случае я настоятельно рекомендую вам подключить его к woocommerce_checkout_process

    поэтому поместите эти коды ниже на свои функции. php на свою тему или создайте свои собственные плагины woocommerce и поместите их в код начальной загрузки.

     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' ); } 

    Вы не должны редактировать файлы плагинов , потому что если вы обновите плагин, все настройки будут потеряны, а вы можете использовать hook для достижения своей цели. Для этого вы можете использовать woocommerce_checkout_process .

    Вот код:

     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'); } } 

    Код идет в файле functions.php вашей активной дочерней темы (или темы). Или также в любых плагинах PHP-файлов.

    Обратите внимание: по умолчанию WooCommerce использует поле billing_phone для получения номера телефона, но если вы его настроили, вы можете заменить billing_phone своим именем поля.

    Надеюсь это поможет!

    В вашем вопросе вы говорите, что правило проверки не работает, и я предполагаю, что оно написано неправильно. Вы можете протестировать его в Интернете с помощью инструментов regexp, например Regex101 или других.

    Чтобы ответить на более общие вопросы по этой теме, безопасное изменение правил проверки может быть выполнено следующим образом:

    Сделайте копию class-wc-validation.php в своем каталоге тем в your_theme_path/woocommerce/includes/class-wc-validation.php и внесите настройки в правила проверки.

    Затем вы должны сделать правило проверки для телефона, зарегистрированного в checkout.js иначе ваше поле всегда будет иметь зеленую рамку, несмотря на то, что это неверно.

    Таким образом, мое решение состояло в том, чтобы добавить специальный проверочный checkout.js регулярного выражения в checkout.js о строке 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; } } } 

    И включите свой настроенный файл .js (в 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' ) ); }} 

    Надеюсь это поможет!

    Столкнулся с одной и той же проблемой и следил за тем, что здесь говорили другие, но Woocommerce устанавливает ошибки только после проверки woocommerce_checkout_process .

    Но в последнем Woocommerce 3.0 (не уверен, что это в версии 2.x), мы можем использовать крюк woocommerce_after_checkout_validation а затем изучить параметр $data если вы используете стандартные поля проверки или используете $_POST если у вас есть настраиваемые поля, которые не добавляются стандартным способом Woocommerce. Пример кода:

     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); 

    Надеюсь, это поможет!