如何更改woocommerce自定义用户注册字段中错误显示的顺序

Posted

技术标签:

【中文标题】如何更改woocommerce自定义用户注册字段中错误显示的顺序【英文标题】:How to Change order of error dispaly in custom user registration fileds in woocommerce 【发布时间】:2021-12-24 17:27:44 【问题描述】:

我使用子主题概念定制了新的用户注册表单。 为此,我覆盖了 form-login.php 文件。

wp-content/pluings/woocommerce/templates/myaccount/form-login.php

我的新发是这样的

自定义注册代码

<form method="post" class="woocommerce-form woocommerce-form-register register" <?php do_action( 'woocommerce_register_form_tag' ); ?> >

            <?php do_action( 'woocommerce_register_form_start' ); ?>

            <?php if ( 'no' === get_option( 'woocommerce_registration_generate_username' ) ) : ?>

                <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
                    <label for="reg_username"><?php esc_html_e( 'Username', 'woocommerce' ); ?>&nbsp;<span class="required">*</span></label>
                    <input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="username" id="reg_username" autocomplete="username" value="<?php echo ( ! empty( $_POST['username'] ) ) ? esc_attr( wp_unslash( $_POST['username'] ) ) : ''; ?>" /><?php // @codingStandardsIgnoreLine ?>
                </p>

                <?php endif; ?>

                <p class="form-row form-row-first">
                <label for="reg_billing_first_name"><?php _e( 'First name', 'woocommerce' ); ?><span class="required">*</span></label>
                <input type="text" class="input-text" name="billing_first_name" id="reg_billing_first_name" value="<?php if ( ! empty( $_POST['billing_first_name'] ) ) esc_attr_e( $_POST['billing_first_name'] ); ?>" />
                </p>

                <p class="form-row form-row-last">
                <label for="reg_billing_last_name"><?php _e( 'Last name', 'woocommerce' ); ?><span class="required">*</span></label>
                <input type="text" class="input-text" name="billing_last_name" id="reg_billing_last_name" value="<?php if ( ! empty( $_POST['billing_last_name'] ) ) esc_attr_e( $_POST['billing_last_name'] ); ?>" />
                </p>

                <p class="form-row form-row-wide">
                <label for="reg_dob"><?php _e( 'Date of Birth', 'woocommerce' ); ?><span class="required">*</span></label>
                <input type="text" class="input-text" name="reg_customer_dob" id="reg_customer_dob"  />
                </p>

                <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
                <label for="reg_email"><?php esc_html_e( 'Email address', 'woocommerce' ); ?>&nbsp;<span class="required">*</span></label>
                <input type="email" class="woocommerce-Input woocommerce-Input--text input-text" name="email" id="reg_email" autocomplete="email" value="<?php echo ( ! empty( $_POST['email'] ) ) ? esc_attr( wp_unslash( $_POST['email'] ) ) : ''; ?>" /><?php // @codingStandardsIgnoreLine ?>
                </p>

                <p class="form-row form-row-wide">
                <label for="reg_billing_email_cnfrm"><?php _e( 'Please Confirm Email Address ', 'woocommerce' ); ?><span class="required">*</span></label>
                <input type="text" class="input-text" name="billing_email_cnfrm" id="reg_billing_email_cnfrm"  />
                </p>

                <?php if ( 'no' === get_option( 'woocommerce_registration_generate_password' ) ) : ?>

                <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
                <label for="reg_password"><?php esc_html_e( 'Password', 'woocommerce' ); ?>&nbsp;<span class="required">*</span></label>
                <input type="password" class="woocommerce-Input woocommerce-Input--text input-text" name="password" id="reg_password" autocomplete="new-password" />
                </p>

                <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
                <label for="confirm_password"><?php esc_html_e( 'Confirm Password', 'woocommerce' ); ?>&nbsp;<span class="required">*</span></label>
                <input type="password" class="woocommerce-Input woocommerce-Input--text input-text" name="user_password_again" id="confirm_password" autocomplete="confirm-password" />
                </p>

                <?php else : ?>

                <p><?php esc_html_e( 'A password will be sent to your email address.', 'woocommerce' ); ?></p>

                <?php endif; ?>

                <p class="form-row form-row-wide">
                <label for="reg_billing_phone"><?php _e( 'Mobile', 'woocommerce' ); ?><span class="required">*</span></label>
                <input type="text" class="input-text" name="billing_phone" id="reg_billing_phone"  />
                </p>

                <div class="clear"></div>

            <?php do_action( 'woocommerce_register_form' ); ?>

            <p class="woocommerce-form-row form-row">
                <?php wp_nonce_field( 'woocommerce-register', 'woocommerce-register-nonce' ); ?>
                <button type="submit" class="woocommerce-Button woocommerce-button button woocommerce-form-register__submit" name="register" value="<?php esc_attr_e( 'Register', 'woocommerce' ); ?>"><?php esc_html_e( 'Register', 'woocommerce' ); ?></button>
            </p>

            <?php do_action( 'woocommerce_register_form_end' ); ?>

        </form>

我正在验证这样的字段 -

function wooc_validate_extra_register_fields( $username, $email, $validation_errors ) 
    if ( isset( $_POST['billing_first_name'] ) && empty( $_POST['billing_first_name'] ) ) 
           $validation_errors->add( 'billing_first_name_error', __( '<strong>Error</strong>: First name is required!', 'woocommerce' ) );
    
    if ( isset( $_POST['billing_last_name'] ) && empty( $_POST['billing_last_name'] ) ) 
           $validation_errors->add( 'billing_last_name_error', __( '<strong>Error</strong>: Last name is required!.', 'woocommerce' ) );
    
    if ( isset( $_POST['billing_phone'] ) && empty( $_POST['billing_phone'] ) ) 
        $validation_errors->add( 'billing_mobile_number_error', __( '<strong>Error</strong>: Mobile number is required!.', 'woocommerce' ) );
    
    if ( isset( $_POST['reg_customer_dob'] ) && empty( $_POST['reg_customer_dob'] ) ) 
        $validation_errors->add( 'reg_customer_dob_error', __( '<strong>Error</strong>: Date of Birth is required!.', 'woocommerce' ) );
    
    if ( isset( $_POST['user_password_again'] ) && empty( $_POST['user_password_again'] ) ) 
        $validation_errors->add( 'reg_customer_dob_error', __( '<strong>Error</strong>: Confirm Password is required!.', 'woocommerce' ) );
    

    if ( $_POST['user_password_again']  != $_POST['password']  ) 
        //$_POST['password'] Default password filed
        $validation_errors->add( 'reg_customer_dob_error', __( '<strong>Error</strong>: Password not match!.', 'woocommerce' ) );
    

    if ( isset( $_POST['billing_email_cnfrm'] ) && empty( $_POST['billing_email_cnfrm'] ) ) 
        $validation_errors->add( 'reg_customer_dob_error', __( '<strong>Error</strong>: Confirm Email is required!.', 'woocommerce' ) );
    

    if ( $_POST['billing_email_cnfrm']  != $_POST['email']  ) 
        //$_POST['eamil'] Default eamil filed
        $validation_errors->add( 'reg_customer_dob_error', __( '<strong>Error</strong>: Email not match!.', 'woocommerce' ) );
    
 

       return $validation_errors;

add_action( 'woocommerce_register_post', 'wooc_validate_extra_register_fields', 10, 3 );

在验证过程中,表单正在验证且工作正常,但以错误的顺序显示错误消息。(附上图片以更清楚地说明问题)

目前按以下顺序显示错误

    电子邮件 密码 名字 姓氏 手机号码 出生日期 确认密码 确认电子邮件

但它应该按照以下顺序 -

    名字 姓氏 出生日期 电子邮件 确认电子邮件 密码 确认密码 手机号

谁能帮我改一下错误信息的顺序

更新

在验证中更改 IF 块的顺序并不能解决问题。这个我已经试过了。

【问题讨论】:

首先,你使用了错误的钩子woocommerce_register_post返回$username。但是,如果您使用正确的挂钩,它将在默认电子邮件 - 密码错误消息之前或之后显示错误消息(取决于您使用的挂钩)。因此,您必须删除/重建现有字段的验证以匹配显示错误消息的顺序。您对模板文件的调整也包含一些错误,例如,您交替使用了reg_ 前缀。简而言之,您所问的当然是可能的,但需要广泛的回答 嗨 7uc1f3r。感谢您的回复。您能否建议我应该使用哪个来更改订单或者我应该使用基于 JS 的验证。您的建议对我很有帮助。 以下link 指向执行验证的文件。在第 78 行,您可以看到当前的钩子,在第 80 行,您应该/可以使用的钩子。只有您会在第 43、47 行等处看到 return 已使用。所以这些错误信息是在你的钩子执行之前执行的。由于无法通过挂钩更改此设置,因此您必须重写 wc_create_new_customer() 函数以满足您的问题 感谢@7uc1f3r 的帮助。我正在检查。 【参考方案1】:

试试下面的代码。

function wooc_validate_extra_register_fields( $username, $email, $validation_errors ) 
    
    if ( isset( $_POST['billing_first_name'] ) && empty( $_POST['billing_first_name'] ) ) 
        $validation_errors->add( 'billing_first_name_error', __( '<strong>Error</strong>: First name is required!', 'woocommerce' ) );
    
    
    if ( isset( $_POST['billing_last_name'] ) && empty( $_POST['billing_last_name'] ) ) 
        $validation_errors->add( 'billing_last_name_error', __( '<strong>Error</strong>: Last name is required!.', 'woocommerce' ) );
    
    
    if ( isset( $_POST['reg_customer_dob'] ) && empty( $_POST['reg_customer_dob'] ) ) 
        $validation_errors->add( 'reg_customer_dob_error', __( '<strong>Error</strong>: Date of Birth is required!.', 'woocommerce' ) );
    
    
    if ( isset( $_POST['billing_email_cnfrm'] ) && empty( $_POST['billing_email_cnfrm'] ) ) 
        $validation_errors->add( 'reg_customer_dob_error', __( '<strong>Error</strong>: Confirm Email is required!.', 'woocommerce' ) );
    

    if ( $_POST['billing_email_cnfrm'] != $_POST['email']  ) 
        //$_POST['eamil'] Default eamil filed
        $validation_errors->add( 'reg_customer_dob_error', __( '<strong>Error</strong>: Email not match!.', 'woocommerce' ) );
    

    if ( isset( $_POST['user_password_again'] ) && empty( $_POST['user_password_again'] ) ) 
        $validation_errors->add( 'reg_customer_dob_error', __( '<strong>Error</strong>: Confirm Password is required!.', 'woocommerce' ) );
    

    if ( $_POST['user_password_again'] != $_POST['password']  ) 
        //$_POST['password'] Default password filed
        $validation_errors->add( 'reg_customer_dob_error', __( '<strong>Error</strong>: Password not match!.', 'woocommerce' ) );
    

    if ( isset( $_POST['billing_phone'] ) && empty( $_POST['billing_phone'] ) ) 
        $validation_errors->add( 'billing_mobile_number_error', __( '<strong>Error</strong>: Mobile number is required!.', 'woocommerce' ) );
    
    
    return $validation_errors;


add_action( 'woocommerce_register_post', 'wooc_validate_extra_register_fields', 10, 3 );

【讨论】:

感谢 bhautik 的回复。在询问更改顺序的问题之前,我已经尝试过这种方法(更改 if 块的验证顺序),但我运气不好,它不起作用。

以上是关于如何更改woocommerce自定义用户注册字段中错误显示的顺序的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义字段添加到 WooCommerce 注册表单

如何在自定义 woocommerce 结帐字段中显示 $_SESSION 变量?

在 WooCommerce 新用户注册电子邮件中添加自定义字段

WooCommerce 自定义字段 - 多选

添加将更改 Woocommerce 简单产品中价格的选择字段

在Woocommerce管理订单页面中显示自定义结帐字段值