WooCommerce“我的帐户”注册表单中的生日字段未保存

Posted

技术标签:

【中文标题】WooCommerce“我的帐户”注册表单中的生日字段未保存【英文标题】:Birthday field in the WooCommerce "My account" registration form is not saved 【发布时间】:2022-01-23 00:37:49 【问题描述】:

连同客户的名字和姓氏字段,我在 WooCommerce“我的帐户”注册表单中添加了一个自定义生日字段,实际上是 3 个select 标签。问题是,由于某些原因,生日没有保存。 我的代码有什么问题?

我提到,出于我的原因,我不想使用 input 字段作为生日。

/** Add custom fields to the "My account" customer registration form **/
add_action( 'woocommerce_register_form_start', function()  
    ?>
    <p class="form-row form-row-first-name">
        <label for="billing_first_name"><?php _e( 'First name', 'woocommerce' ); ?><span class="required">*</span></label>
        <input type="text" class="input-text" name="billing_first_name" id="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-name">
        <label for="billing_last_name"><?php _e( 'Last name', 'woocommerce' ); ?><span class="required">*</span></label>
        <input type="text" class="input-text" name="billing_last_name" id="billing_last_name" value="<?php if ( ! empty( $_POST['billing_last_name'] ) ) esc_attr_e( $_POST['billing_last_name'] ); ?>" />
    </p>

    <table class="form-table">
        <tr>
            <th><label for="birth-date-day"><?php echo __( 'Birthday' ); ?></label></th>
            <td>
                <select id="birth-date-day" name="birthday[day]">
                    <option selected="selected" value=""><?php echo __( 'Day' ); ?></option><?php
                    for( $i = 1; $i <= 31; $i++ ) 
                        printf( '<option value="%1$s">%1$s</option>', $i );
                     ?>
                </select>

                <select id="birth-date-month" name="birthday[month]">
                    <option selected="selected" value=""><?php echo __( 'Month' ); ?></option>
                    <option><?php echo __( 'January' ); ?></option>
                    <option><?php echo __( 'February' ); ?></option>
                    <option><?php echo __( 'March' ); ?></option>
                    <option><?php echo __( 'April' ); ?></option>
                    <option><?php echo __( 'May' ); ?></option>
                    <option><?php echo __( 'June' ); ?></option>
                    <option><?php echo __( 'July' ); ?></option>
                    <option><?php echo __( 'August' ); ?></option>
                    <option><?php echo __( 'September' ); ?></option>
                    <option><?php echo __( 'October' ); ?></option>
                    <option><?php echo __( 'November' ); ?></option>
                    <option><?php echo __( 'December' ); ?></option>
                </select>

                <select id="birth-date-year" name="birthday[year]">
                    <option selected="selected" value=""><?php echo __( 'Year' ); ?></option><?php
                    for( $i = date("Y") - 14; $i >= date("Y") - 99 ; $i-- ) 
                        printf( '<option value="%1$s">%1$s</option>', $i );
                     ?>
                </select>
            </td>
        </tr>
    </table>

    <?php
 );

/** Validate "My account" registration form custom fields **/
add_action( 'woocommerce_register_post', function( $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['birthday'] ) && empty( $_POST['birthday'] ) ) 
        $validation_errors->add( 'birthday_error', __( '<strong>Error</strong>: Birthday is required!.', 'woocommerce' ) );
    

    return $validation_errors;
, 10, 3 );


/** Save "My account" registratio form extra fields **/
add_action( 'woocommerce_created_customer', function( $customer_id ) 
    if( isset( $_POST['billing_first_name'] ) ) 
        update_user_meta( $customer_id, 'first_name', sanitize_text_field( $_POST['billing_first_name'] ) );
        update_user_meta( $customer_id, 'billing_first_name', sanitize_text_field( $_POST['billing_first_name'] ) );
    

    if( isset( $_POST['billing_last_name'] ) ) 
        update_user_meta( $customer_id, 'last_name', sanitize_text_field( $_POST['billing_last_name'] ) );
        update_user_meta( $customer_id, 'billing_last_name', sanitize_text_field( $_POST['billing_last_name'] ) );
    

    if( isset( $_POST['birthday'] ) ) 
        // convert from array to 'd F Y' date format string
        $birthday = implode( ' ', sanitize_text_field( $_POST['birthday'] ) );
        $birthday = str_replace( ' ', '', $birthday ); // strip spaces

        // convert from 'd F Y' string to 'Y-m-d' date format
        $birthday = date( 'Y-m-d', strtotime( $birthday ) );

        update_user_meta( $customer_id, 'birthday', $birthday );
    
 );

【问题讨论】:

问题是因为您有 3 个单独的字段(日、月、年)并且您在保存时只处理 1 个字段。如果您想让自己更轻松,可以使用日期字段,请参阅Add birthday field to WooCommerce my account and admin user page @7uc1f3r 我知道那个解决方案,但是,据我所知,它有一个不便之处——据我所知,显示日历的语言是由浏览器决定的,而不是由开发人员决定的。或不?我的网站不是英文的。 【参考方案1】:

我稍微更改了月份的 select 部分和生日的保存部分,现在我的代码可以工作了,所以我在数据库中保存了 yyyy-mm-dd 格式的生日。

<select id="birth-date-month" name="birthday[month]" />
    <option selected="selected" value=""><?php echo __( 'Month' ); ?></option>
    <option value="1"><?php _e( 'January' ); ?></option>
    <option value="2"><?php _e( 'February' ); ?></option>
    <option value="3"><?php _e( 'March' ); ?></option>
    <option value="4"><?php _e( 'April' ); ?></option>
    <option value="5"><?php _e( 'May' ); ?></option>
    <option value="6"><?php _e( 'June' ); ?></option>
    <option value="7"><?php _e( 'July' ); ?></option>
    <option value="8"><?php _e( 'August' ); ?></option>
    <option value="9"><?php _e( 'September' ); ?></option>
    <option value="10"><?php _e( 'October' ); ?></option>
    <option value="11"><?php _e( 'November' ); ?></option>
    <option value="12"><?php _e( 'December' ); ?></option>
</select>

if( isset( $_POST['birthday'] ) ) 
    // convert from array to 'd F Y' date format string
    $birthday = implode( '-', $_POST['birthday'] );

    // convert from 'd F Y' string to 'Y-m-d' date format
    $birthday = date( 'Y-m-d', strtotime( $birthday ) );

    update_user_meta( $customer_id, 'birthday', $birthday );

【讨论】:

以上是关于WooCommerce“我的帐户”注册表单中的生日字段未保存的主要内容,如果未能解决你的问题,请参考以下文章

Woocommerce 如何在我的帐户页面上重定向自定义端点

从 WooCommerce 的“客户”角色中隐藏我的帐户中的帐户资金充值

WooCommerce 不会将密码发送给在“我的帐户”页面上注册的客户

删除用户名字段注册表单 - Woocommerce

WooCommerce:将端点分配给我的帐户页面中的自定义模板

根据 WooCommerce 3+ 中的用户角色添加自定义我的帐户菜单项