WooCommerce结账字段的自定义验证

14
我想为验证电话号码添加自己的正则表达式。在我的class-wc-validation.php中,我已将正则表达式更改为满足我的要求。
public static function is_phone( $phone ) {
    //if ( strlen( trim( preg_replace( '/[\s\#0-9_\-\+\(\)]/', '', $phone ) ) ) > 0 )
    if ( strlen( trim( preg_replace( '/^[6789]\d{9}$/', '', $phone ) ) ) > 0 )
        return false;

    return true;
}

但是验证没有进行。我错过了什么?

4个回答

26

遇到了同样的问题,按照其他人在这里说的做法去做,但是Woocommerce只有在woocommerce_checkout_process钩子后才会设置验证错误。

但是,在最新的Woocommerce 3.0中(不确定2.x版本是否也适用),我们可以使用woocommerce_after_checkout_validation钩子,然后查看$data参数(如果您正在使用标准结帐字段)或使用$_POST(如果您有自定义字段不是通过标准Woocommerce添加的)。以下是代码示例:

public function validate($data,$errors) { 
    // Do your data processing here and in case of an 
    // error add it to the errors array like:
        $errors->add( 'validation', __( 'Please input that correctly.' ));
}
add_action('woocommerce_after_checkout_validation', 'validate',10,2);

希望这能有所帮助!


21

我还没有看到您将这些内容与Woocommerce结账流程连接的代码。 请查阅他们的文档:

woocommerce_checkout_processwoocommerce_checkout_order_processed

但在您的情况下,我强烈建议您将其挂钩在 woocommerce_checkout_process 上。

因此,请将以下代码放在您的主题的 functions.php 中,或者创建自己的 Woocommerce 插件,并将其放在引导代码中。

add_action('woocommerce_checkout_process', 'is_phone');

function is_phone() { 
    $phone_number = $_POST['---your-phone-field-name---'];
    // your function's body above, and if error, call this wc_add_notice
    wc_add_notice( __( 'Your phone number is wrong.' ), 'error' );
}

10

不应该编辑插件文件,因为如果更新插件,所有的自定义将会丢失,相反,您可以使用钩子来实现您的目标。您可以使用woocommerce_checkout_process钩子来完成这个操作。

这是代码:

add_action('woocommerce_checkout_process', 'wh_phoneValidateCheckoutFields');

function wh_phoneValidateCheckoutFields() {
    $billing_phone = filter_input(INPUT_POST, 'billing_phone');

    if (strlen(trim(preg_replace('/^[6789]\d{9}$/', '', $billing_phone))) > 0) {
        wc_add_notice(__('Invalid <strong>Phone Number</strong>, please check your input.'), 'error');
    }
}

代码放在您的活动子主题(或主题)的functions.php文件中。或者也可以放在任何插件PHP文件中。

请注意:默认情况下,WooCommerce使用billing_phone字段来获取电话号码,但如果您已自定义,则可以将billing_phone替换为您的字段名称。

希望这可以帮助您!


0
在你的问题中,你说验证规则不起作用,我猜测它可能写错了。你可以使用正则表达式工具在线测试,例如Regex101或其他工具。
更一般地回答这个问题,安全地更改验证规则可以通过以下方式完成:
class-wc-validation.php复制到你的主题目录下的your_theme_path/woocommerce/includes/class-wc-validation.php,并对验证规则进行自定义修改。
然后,你应该在checkout.js中为电话字段设置验证规则,否则你的字段始终会有绿色边框,尽管它是无效的。
所以我的解决方案是在checkout.js的大约第192行添加自定义正则表达式验证器。
    if ( $parent.is( '.validate-phone' ) ) {
            if ( $this.val() ) {

                var pattern = new RegExp(/^([0-9\s\/\+\-\#\_\(\)]*)$/);

                if ( ! pattern.test( $this.val()  ) ) {
                    $parent.removeClass( 'woocommerce-validated' ).addClass( 'woocommerce-invalid woocommerce-invalid-phone' );
                    validated = false;
                }
            }
        }

并包含您自定义的 .js 文件(在 functions.php 中)

add_action( 'wp_enqueue_scripts', 'my_checkoutjs_enqueue_scripts', 100 );

function gv_checkoutjs_enqueue_scripts() {

if ( is_checkout() ) {
    wp_deregister_script( 'wc-checkout' );
    wp_enqueue_script( 'wc-checkout', get_template_directory_uri() . '/js/modified_checkout.js', array( 'jquery', 'woocommerce', 'wc-country-select', 'wc-address-i18n' ) );
}}

希望这能帮到你!


你不应该覆盖核心文件,这是一个坏主意,更何况在你商店的重要插件中这样做。 - svelandiag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接