A veces, en WooCommerce, se requiere que el cliente complete el nombre de la calle y el número de la casa en un solo campo.
En este caso, queremos validar el campo de pago billing_address_1 de WooCommerce para comprobar si contiene números antes de procesar el pedido. Hemos probado una serie de métodos para hacer esto, pero sin suerte.
Este método estándar de WooCommerce no funciona:
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' ); }Estos devuelven bool (falso) en la página de pago:
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);Esta solución de front-end no funciona.
document.querySelector("#place_order").addEventListener("click", validateAddressField); function validateAddressField () { console.log('Okay dan!'); }¿Qué más puedo intentar para garantizar que la validación se lleve a cabo antes de que se procese el pedido?
// 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.' ); } }Esto no funciona correctamente en su código: strpbrk($_POST['billing_address_1'], '1234567890') .
La función de PHP preg_match() es más apropiada aquí.
Así que hice algunos pequeños cambios en tu código para que funcione como esperas:
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' ) ) ); } }Este código está probado y funciona en las versiones 2.6.x y 3.0+ de WooCommerce…
*Este código va en el archivo function.php de su tema (o tema) secundario activo o también en cualquier archivo de complemento.
Referencia: WC_Checkout - código fuente de process_checkout()