WooCommerce 结帐字段的自定义验证

Posted

技术标签:

【中文标题】WooCommerce 结帐字段的自定义验证【英文标题】:Custom validation of WooCommerce checkout fields 【发布时间】: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]\d9$/', '', $phone ) ) ) > 0 )
        return false;

    return true;

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

【问题讨论】:

【参考方案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]\d9$/', '', $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);

希望有帮助!

【讨论】:

以上是关于WooCommerce 结帐字段的自定义验证的主要内容,如果未能解决你的问题,请参考以下文章

所有 WooCommerce 结帐字段的自定义占位符

如何在 woo commerce 的结帐表单字段中删除额外的 div html 类

Woocommerce 3中的自定义结帐字段和运输方式ajax交互

使 Woocommerce (3.8.0) 管理员电子邮件包含结帐页面中的自定义字段数据

根据 WooCommerce 中的自定义结帐单选按钮和文本字段设置动态费用

WooCommerce 4.0 电子邮件、管理员订单和感谢页面上的自定义结帐和 ACF 字段值