Убедитесь, что WooCommerce address_field_1 содержит номер дома перед порядком обработки

Иногда в WooCommerce клиент должен заполнить название улицы и номер дома в одном поле.

В этом случае мы хотим затем проверить поле проверки billing_address_1 WooCommerce, чтобы проверить, содержит ли он цифры перед обработкой заказа. Мы пробовали ряд методов, чтобы сделать это, но без везения.

Этот стандартный метод WooCommerce не работает:

add_action('woocommerce_checkout_process', 'custom_checkout_field_check'); function custom_checkout_field_check() { // Check if set, if its not set add an error. if ( $_POST['billing_address_1'] && strpbrk($_POST['billing_address_1'], '1234567890') ) wc_add_notice( __( 'Het adresveld moet minimaal een huisnummer bevatten' ), 'error' ); } 

Они возвращают bool (false) на странице проверки:

 var_dump($_POST['billing_address_1'] == true); var_dump($_POST['billing_address_2'] == true); var_dump($_POST['billing_postcode'] == true); var_dump($_POST['billing_email'] == true); 

Это временное решение не работает.

 document.querySelector("#place_order").addEventListener("click", validateAddressField); function validateAddressField () { console.log('Okay dan!'); } 

Что еще я могу попытаться обеспечить, чтобы проверка выполнялась до обработки заказа?

  // Check if address field contains house number otherwise provide error message add_action( 'woocommerce_after_checkout_validation', 'validate_checkout', 10, 2); function validate_checkout( $data, $errors ){ if ( ! preg_match('/[0-9]/', $data[ 'billing_address_1' ] ) ){ $errors->add( 'address', 'Sorry, but the address you provided does not contain a house number.' ); } } 

Это неверно работает в вашем коде: strpbrk($_POST['billing_address_1'], '1234567890') .
preg_match() более уместна функция PHP preg_match() .

Поэтому я внес некоторые небольшие изменения в ваш код, чтобы он работал так, как вы ожидаете:

 add_action('woocommerce_checkout_process', 'address_field_validation', 10, 0); function address_field_validation() { // The field value to check $post_value = $_POST['billing_address_1']; // If there is no number in this field value, stops the checkout process // and displays an error message. if ( $post_value && ! preg_match( '/[0-9]+/', $post_value ) ) { // The error message throw new Exception( sprintf( __( 'Het adresveld moet minimaal een huisnummer bevatten', 'woocommerce' ) ) ); } } 

Этот код протестирован и работает с версиями WooCommerce 2.6.x и 3.0 + …

* Этот код находится в файле function.php вашей активной дочерней темы (или темы), а также в любом файле плагина.


Ссылка: WC_Checkout – исходный код process_checkout ()

Вы можете попробовать использовать hook: – woocommerce_after_checkout_validation

Пожалуйста, ознакомьтесь с инструкциями по использованию этого крючка и примера кода здесь.

Дай мне знать если тебе нужно что-нибудь еще…