在处理订单之前检查 WooCommerce address_field_1 是否包含门牌号

Check if WooCommerce address_field_1 contains house number before processing order

有时,在 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' );
    }

结帐页面上的 return 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!');
}

我还能做些什么来确保在处理订单之前进行验证?

您可以尝试使用 hook :- woocommerce_after_checkout_validation

请参考如何使用这个钩子和示例代码here

如果您还需要什么,请告诉我...

这在您的代码中无法正常工作: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 文件中或任何插件文件中。


参考:WC_Checkout - process_checkout() source code

    // 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.' ); 
        }
    }