Иногда в 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
Пожалуйста, ознакомьтесь с инструкциями по использованию этого крючка и примера кода здесь.
Дай мне знать если тебе нужно что-нибудь еще…