Я хотел бы добавить свое собственное регулярное выражение для проверки номера телефона. В моем 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
поэтому поместите эти коды ниже в файл functions.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' );
}
Столкнулся с той же проблемой и следовал тому, что говорили здесь другие, но Woocommerce только устанавливает ошибки при проверке после woocommerce_checkout_process
крюк.
Но в последней версии Woocommerce 3.0 (не уверен, что это в версии 2.x), мы можем использовать woocommerce_after_checkout_validation
крюк, а затем посмотрите в $data
param, если вы используете стандартные поля оформления заказа или используете $_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);
Надеюсь, это поможет!
Вы не должны редактировать файлы плагинов, потому что если вы обновите плагин все
настройка будет потеряна, скорее вы можете использовать крючок для достижения
Цель. Вы можете использовать с помощью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
с вашим именем поля.
Надеюсь это поможет!
В своем вопросе вы говорите, что правило проверки не работает, и я думаю, что оно написано неправильно. Вы можете проверить это онлайн с помощью инструментов регулярных выражений, например, Regex101 или другие
Чтобы ответить на этот вопрос более широко, безопасное изменение правил проверки может быть сделано следующим образом:
Сделать копию class-wc-validation.php
в каталог вашей темы в your_theme_path/woocommerce/includes/class-wc-validation.php
и внесите изменения в правила валидации.
Затем вы должны сделать правило проверки для телефона, поданного в 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' ) );
}}
Надеюсь это поможет!