Сохранение данных формы с пользовательской вкладки WooCommerce My Account - PullRequest
2 голосов
/ 18 июня 2019

Я создал новую вкладку «Сведения о пользователе» в «Моя учетная запись» и заполнил вкладку полями формы для сбора сведений об участниках, таких как хобби, день рождения и т. Д. Затем эти данные отображаются на панели «Моя учетная запись».

Как сохранить данные, представленные на новой вкладке Сведения об участнике?

На многих сайтах есть примеры, как отображать информацию на новых вкладках, но я не смог найти ни одной, показывающей, как отправлять и сохранять данные формы.

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 голосов
/ 18 июня 2019

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 решает эту проблему путем поиска одноразовых номеров, полей записей и использования функций is_ *.Одна из стратегий, которую я использую, состоит в том, чтобы начать свою функцию с

if(filter_input(INPUT_SERVER, 'REQUEST_METHOD') !== 'POST') {
    return;
}

. Это приведет к выходу из функции, если мы не обнаружим действие POST на странице.

Если вы решите выполнитьПри проверке формы вы столкнетесь с проблемами при составлении отчетов об ошибках, если решите использовать wc_add_notice, особенно если вы решите перенаправить после обработки формы.Если вы выполните перенаправление после использования wc_add_notice, ваше уведомление будет потеряно, так как уведомления не сохраняются при загрузке страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...