代码之家  ›  专栏  ›  技术社区  ›  Ajith S Balaji

自定义字段woo commerce checkout上的验证错误

  •  0
  • Ajith S Balaji  · 技术社区  · 2 年前

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

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

    0 回复  |  直到 7 年前
        1
  •  21
  •   r4ccoon    9 年前

    我还没有看到你的代码将这些连接到woocommerce结账流程。 请查看他们的文件

    woocommerce_checkout_process woocommerce_checkout_order_processed

    但对你来说,我强烈建议你把它挂在 woocommerce_checkout_流程

    所以把下面这些代码放在你的函数上。或者创建自己的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' );
    }
    
        2
  •  18
  •   shivaramanaiyer    7 年前

    也面临同样的问题,并遵循其他人在这里所说的,但Woocommerce只在验证后设置错误 woocommerce_checkout_process

    但是,在最新的Woocommerce 3.0中(不确定这是否在2.x版本中),我们可以使用 woocommerce_after_checkout_validation 钩住,然后查看 $data 如果使用标准签出字段或 $_POST 如果您有未以标准方式添加的自定义字段。代码的一个例子是:

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

    希望有帮助!

        3
  •  8
  •   Raunak Gupta    7 年前

    你不应该编辑插件文件 ,因为如果你更新所有的插件 定制将丢失,而您可以使用钩子来实现 球门你可以使用 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文件中。

    请注意: 默认情况下,使用 billing_phone 字段来获取电话号码,但如果您已经自定义了它,则可以替换它 付费电话 用你的域名。

    希望这有帮助!

        4
  •  0
  •   Arkady    7 年前

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

    要回答更一般的问题,可以通过以下方式安全地更改验证规则:

    复印 class-wc-validation.php 到中的主题目录 your_theme_path/woocommerce/includes/class-wc-validation.php 并对验证规则进行定制。

    然后你应该为提交的手机制定一个验证规则 checkout.js 否则,尽管字段无效,但它始终具有绿色边框。

    因此,我的解决方案是将自定义正则表达式验证器添加到 结账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' ) );
    }}
    

    希望这有帮助!