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 不会将密码发送给在“我的帐户”页面上注册的客户