【问题标题】:Custom validation of WooCommerce checkout fieldsWooCommerce 结帐字段的自定义验证
【发布时间】:2015-04-20 14:34:02
【问题描述】:

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

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

【问题讨论】:

    标签: php wordpress validation woocommerce checkout


    【解决方案1】:

    我还没有看到将这些与 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' );
    }
    

    【讨论】:

      【解决方案2】:

      你不应该编辑插件文件,因为如果你更新插件所有 自定义将丢失,而是您可以使用钩子来实现您的 目标。你可以使用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 替换为您的字段名称。

      希望这会有所帮助!

      【讨论】:

        【解决方案3】:

        在您的问题中,您是说验证规则不起作用,我猜它是以错误的方式编写的。您可以使用正则表达式工具在线测试它,例如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' ) );
        }}
        

        希望这会有所帮助!

        【讨论】:

        • 你不应该覆盖核心文件,这是一个坏主意,更重要的是在你的商店的基本插件中这样做。
        【解决方案4】:

        面临同样的问题并遵循其他人在此处所说的内容,但 Woocommerce 仅在 woocommerce_checkout_process 钩子之后设置验证错误。

        但是,在最新的 Woocommerce 3.0 中(不确定这是否在 2.x 版本中),如果您使用标准结帐字段或如果您有未以标准 Woocommerce 方式添加的自定义字段,请使用 $_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);
        

        希望有帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-02
          • 2018-11-02
          • 1970-01-01
          • 2023-04-10
          • 2018-08-07
          • 2018-11-22
          • 2018-08-15
          相关资源
          最近更新 更多