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

问题描述:

有时,在WooCommerce中,客户需要在单个字段中填写街道名称和门牌号码。在处理订单前检查WooCommerce address_field_1是否包含门牌号码

在这种情况下,我们希望验证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'); 
    } 

结帐页面上的这些返回布尔(假):

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

您应该删除您的其他类似的问题......因为它是这一个的副本。 – LoicTheAztec

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

您可以尝试使用钩: - woocommerce_after_checkout_validation

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

让我知道,如果你有什么事?

+0

这不是一个完整的答案 –

这不是在你的代码中正确工作: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

+0

谢谢你的努力,尽管我找到了WooCommerce团队的解决方案。我会加入它作为答案。 – mdarmanin