我在“我的帐户”中创建了一个新的“会员详细信息”选项卡,并在该选项卡中填充了表单字段,以收集诸如爱好,生日等会员详细信息。这些详细信息随后显示在“我的帐户”仪表板上。
如何保存在新的“会员详细信息”标签上提交的数据?
许多站点都有示例如何在新选项卡上显示信息,但我找不到能显示如何提交和保存表单数据的示例。
function add_custom_fields() {
$user = wp_get_current_user();
?>
<form id="edit_member_details" method="post">
<p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
<label for="member_hobbies"><?php _e( 'Member Hobbies', 'woocommerce' ); ?>
<input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="member_hobbies" id="member_hobbies" value="<?php echo esc_attr( $user->member_hobbies ); ?>" />
</p>
<p>
<button type="submit" class="button" name="save_member_details" value="<?php esc_attr_e( 'Save member details', 'woocommerce' ); ?>"><?php esc_html_e( 'Save member details', 'woocommerce' ); ?></button>
<input type="hidden" name="woocommerce_edit_member_details" value="save_member_details" />
</p>
</form>
<?php
}
add_action( 'woocommerce_save_account_details', 'save_member_details', 12, 1 );
function save_member_details( $user_id ) {
if( isset( $_POST['member_hobbies'] ) )
update_user_meta( $user_id, 'member_hobbies', sanitize_text_field( $_POST['member_hobbies'] ) );
}
答案 0 :(得分:0)
Woocommerce处理表单提交的方式是通过创建类,然后将它们挂接到wp
或template_redirect
动作中。您可以通过查看WC_Form_Handler来亲自查看。
根据您的方法,您可以遵循类似的策略,并创建一个早期挂接到的类或函数来处理表单数据。例如
add_action('wp', 'my_form_handler');
function my_form_handler() {
// read in my post data
// process my data.
// optionally redirect
}
您将遇到的一个问题是,此挂钩将在每次调用wp
或template_redirect
时运行,这是每个单页加载。 Woocommerce通过查找随机数,post字段并使用is_ *函数来处理此问题。我使用的一种策略是从
if(filter_input(INPUT_SERVER, 'REQUEST_METHOD') !== 'POST') {
return;
}
如果我们未在页面上检测到POST操作,则会导致该函数退出。
如果您决定执行表单验证,那么在选择使用wc_add_notice
时会遇到报告错误的问题,尤其是当您决定在表单处理后重定向时。如果您在使用wc_add_notice
之后确实进行了重定向,则通知将丢失,因为通知不会在页面加载过程中持续存在。