【问题标题】:Check if WooCommerce address_field_1 contains house number before processing order在处理订单之前检查 WooCommerce address_field_1 是否包含门牌号
【发布时间】:2017-09-21 06:31:29
【问题描述】:

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

在处理订单之前,我还能尝试哪些方法来确保验证发生?

【问题讨论】:

  • 你应该删除你的另一个类似问题......因为它是这个问题的副本。

标签: php wordpress woocommerce checkout hook-woocommerce


【解决方案1】:
    // 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.' ); 
        }
    }

【讨论】:

    【解决方案2】:

    这在您的代码中无法正常工作: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

    【讨论】:

    • 感谢您的努力,尽管我已经从 WooCommerce 团队找到了解决方案。我会将其添加为答案。
    【解决方案3】:

    您可以尝试使用钩子:- woocommerce_after_checkout_validation

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

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

    【讨论】:

    • 这不是一个完整的答案
    猜你喜欢
    • 2019-07-28
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多