繁体   English   中英

自定义验证WooCommerce结帐字段

[英]Custom validation of WooCommerce checkout fields

我想添加自己的正则表达式来验证电话号码。 在我的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;
}

但验证没有发生。 我错过了什么?

我还没有看到你的代码将这些内容挂钩到woocommerce结帐流程。 请查看他们的文档

woocommerce_checkout_processwoocommerce_checkout_order_processed

但在你的情况下,我强烈建议你把它挂在woocommerce_checkout_process

所以把这些代码放在你的主题的functions.php上,或者你创建自己的woocommerce插件,并把它放在bootstrap代码中。

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

面对同样的问题并遵循其他人在此处所说的内容,但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);

希望有所帮助!

你不应该编辑插件文件 ,因为如果你更新插件,所有的自定义都将丢失,而你可以使用hook来实现你的目标。 您可以使用woocommerce_checkout_process hook来执行此操作。

这是代码:

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替换为您的字段名称。

希望这可以帮助!

在您的问题中,您说验证规则不起作用,我猜它是以错误的方式编写的。 您可以使用regexp工具在线测试,例如Regex101或其他工具。

要回答关于此主题的更多一般信息,可以通过以下方式安全地更改验证规则:

class-wc-validation.php的副本复制到your_theme_path/woocommerce/includes/class-wc-validation.php的主题目录, your_theme_path/woocommerce/includes/class-wc-validation.php验证规则进行自定义。

然后你应该为checkout.js提交的手机制定验证规则,否则你的领域总是会有绿色边框,尽管它无效。

所以我的解决方案是将关于第192行的自定义正则表达式验证器添加到checkout.js

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

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM