Я хотел бы добавить собственное регулярное выражение для проверки номера телефона. В моем 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);
Надеюсь, это поможет!