有时,在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!');
}
我还可以尝试确保在处理订单之前进行验证吗?
答案 0 :(得分:2)
// 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.' );
}
}
答案 1 :(得分:1)
这在您的代码中无法正常使用: strpbrk($_POST['billing_address_1'], '1234567890')
。
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文件或任何插件文件。
答案 2 :(得分:0)