首页 > 解决方案 > 在 Woocommerce 验证结帐表单中处理多个子字符串

问题描述

几年前,有人向我们的网站(Wordpress/Woocommerce Checkout)添加了代码,该代码根据前缀和字段长度验证字段。

字段验证代码如下所示:

add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');

function my_custom_checkout_field_process() {
    if ((substr($_POST['billing_manr'],0,3) <> "MA-") || (strlen($_POST['billing_manr']) <> 9))
    wc_add_notice( __( 'Error code ...' ), 'error' );
}

它验证 MA- 和 9 个字母的整体长度。例如,MA-123123 可以,MA-123 不行。

现在我们要针对 MA-xxxxxx 和 BW-xxxxxx 进行验证,但我不确定正确的语法如何。

我已经尝试了以下方法:

add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');

function my_custom_checkout_field_process() {
    if ((substr($_POST['billing_manr'],0,3) <> "MA-") || (substr($_POST['billing_manr'],0,3) <> "BW-") || (strlen($_POST['billing_manr']) <> 9))
    wc_add_notice( __( 'Error code ...' ), 'error' );
}

但是这样验证再次失败,MA-和BW-。

有人可以帮我弄这个吗?

标签: phpwordpressvalidationwoocommercesubstring

解决方案


以下 usingin_array()将处理两个子字符串,如下所示:

add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');
function my_custom_checkout_field_process() {
    if ( isset($_POST['billing_manr']) 
    && ( ! in_array( substr($_POST['billing_manr'], 0, 3), array('MA-', 'BW-') ) 
    || strlen($_POST['billing_manr']) <> 9 ) ) {
        wc_add_notice( __( 'Error code ...', 'woocommerce' ), 'error' );
    }
}

或以preg_match()这种方式使用:

add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');
function my_custom_checkout_field_process() {
    if ( isset($_POST['billing_manr']) 
    && ( ! preg_match('/^MA-|BC-/', $_POST['billing_manr']) 
    || strlen($_POST['billing_manr']) <> 9 ) ) {
        wc_add_notice( __( 'Error code ...', 'woocommerce' ), 'error' );
    }
}

测试和工作。


推荐阅读