从自定义的WooCommerce我的帐户选项卡保存表单数据

时间:2019-06-18 15:26:21

标签: php woocommerce

我在“我的帐户”中创建了一个新的“会员详细信息”选项卡,并在该选项卡中填充了表单字段,以收集诸如爱好,生日等会员详细信息。这些详细信息随后显示在“我的帐户”仪表板上。

如何保存在新的“会员详细信息”标签上提交的数据?

许多站点都有示例如何在新选项卡上显示信息,但我找不到能显示如何提交和保存表单数据的示例。

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'] ) );
}

1 个答案:

答案 0 :(得分:0)

Woocommerce处理表单提交的方式是通过创建类,然后将它们挂接到wptemplate_redirect动作中。您可以通过查看WC_Form_Handler来亲自查看。

根据您的方法,您可以遵循类似的策略,并创建一个早期挂接到的类或函数来处理表单数据。例如

add_action('wp', 'my_form_handler');
function my_form_handler() {
   // read in my post data

   // process my data.

   // optionally redirect
}

您将遇到的一个问题是,此挂钩将在每次调用wptemplate_redirect时运行,这是每个单页加载。 Woocommerce通过查找随机数,post字段并使用is_ *函数来处理此问题。我使用的一种策略是从

开始我的功能
if(filter_input(INPUT_SERVER, 'REQUEST_METHOD') !== 'POST') {
    return;
}

如果我们未在页面上检测到POST操作,则会导致该函数退出。

如果您决定执行表单验证,那么在选择使用wc_add_notice时会遇到报告错误的问题,尤其是当您决定在表单处理后重定向时。如果您在使用wc_add_notice之后确实进行了重定向,则通知将丢失,因为通知不会在页面加载过程中持续存在。