Пользовательская проверка полей оформления заказа в 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;
}

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

8

Решение

Я не видел ваш код, который связывает их с процессом проверки 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' );
}
12

Другие решения

Столкнулся с той же проблемой и следовал тому, что говорили здесь другие, но 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);

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

8

Вы не должны редактировать файлы плагинов, потому что если вы обновите плагин все
настройка будет потеряна, скорее вы можете использовать крючок для достижения
Цель. Вы можете использовать с помощью 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 с вашим именем поля.

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

5

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

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

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector