Пользовательские поля регистрации woocommerce

Вопрос или проблема

Привет, я пытаюсь создать кастомную страницу регистрации для WooCommerce, до этапа валидации все работает нормально, но когда я пытаюсь вставить данные в базу данных, ничего не происходит. Вот пример кода, который я использую ‘

<?php

function wooc_extra_register_fields() {

       ?>



       <p class="form-row form-row-first">

       <label for="reg_billing_first_name"><?php _e( 'First name', 'woocommerce' ); ?><span class="required">*</span></label>

       <input type="text" class="input-text" name="billing_first_name" id="reg_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">

       <label for="reg_billing_last_name"><?php _e( 'Last name', 'woocommerce' ); ?><span class="required">*</span></label>

       <input type="text" class="input-text" name="billing_last_name" id="reg_billing_last_name" value="<?php if ( ! empty( $_POST['billing_last_name'] ) ) esc_attr_e( $_POST['billing_last_name'] ); ?>" />

       </p>



       <div class="clear"></div>



       <p class="form-row form-row-wide">

       <label for="reg_billing_phone"><?php _e( 'Phone', 'woocommerce' ); ?><span class="required">*</span></label>

       <input type="Number" class="input-text" name="billing_phone" id="reg_billing_phone" value="<?php if ( ! empty( $_POST['billing_phone'] ) ) esc_attr_e( $_POST['billing_phone'] ); ?>" />

       </p>


        <p class="form-row form-row-wide">

       <label for="reg_num"><?php _e( 'MCI Registration Num', 'woocommerce' ); ?><span class="required">*</span></label>

       <input type="text" class="input-text" name="reg_num" id="reg_num" value="<?php if ( ! empty( $_POST['reg_num'] ) ) esc_attr_e( $_POST['reg_num'] ); ?>" />

       </p>

        <p class="form-row form-row-wide">

       <label for="Year_of_reg"><?php _e( 'Year of Registration', 'woocommerce' ); ?><span class="required">*</span></label>

       <input type="Number" class="input-text" name="Year_of_reg" id="Year_of_reg" value="<?php if ( ! empty( $_POST['Year_of_reg'] ) ) esc_attr_e( $_POST['Year_of_reg'] ); ?>" />

       </p>


        <p class="form-row form-row-wide">

       <label for="qualification"><?php _e( 'Qualification', 'woocommerce' ); ?><span class="required">*</span></label>

       <input type="text" class="input-text" name="qualification" id="qualification" value="<?php if ( ! empty( $_POST['qualification'] ) ) esc_attr_e( $_POST['qualification'] ); ?>" />

       </p>




       <?php

}



add_action( 'woocommerce_register_form_start', 'wooc_extra_register_fields' );



?>

'<?php

function wooc_validate_extra_register_fields( $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['billing_phone'] ) && empty( $_POST['billing_phone'] ) ) 
       {

              $validation_errors->add( 'billing_phone_error', __( '<strong>Error</strong>: Phone is required!.', 'woocommerce' ) );

       }


       if ( isset( $_POST['reg_num'] ) && empty( $_POST['reg_num'] ) ) 
       {

              $validation_errors->add( 'reg_num_error', __( '<strong>Error</strong>: Registration Number is required! if you are facing any problem give us a call or contact us on [email protected] .', 'woocommerce' ) );

       }


       if ( isset( $_POST['Year_of_reg'] ) && empty( $_POST['Year_of_reg'] ) ) 
       {

              $validation_errors->add( 'year_of_reg_error', __( '<strong>Error</strong>: MCI Year of Registration is required!.', 'woocommerce' ) );

       }




    }


}


add_action( 'woocommerce_register_post', 'wooc_validate_extra_register_fields', 10, 5 );




function wooc_save_extra_register_fields( $customer_id ) {

   if ( isset( $_POST['billing_first_name'] ) ) {
        // WordPress default first name field.
        update_user_meta( $customer_id, 'first_name', sanitize_text_field( $_POST['billing_first_name'] ) );

        // WooCommerce billing first name.
        update_user_meta( $customer_id, 'billing_first_name', sanitize_text_field( $_POST['billing_first_name'] ) );
    }

    if ( isset( $_POST['billing_last_name'] ) ) {
        // WordPress default last name field.
        update_user_meta( $customer_id, 'last_name', sanitize_text_field( $_POST['billing_last_name'] ) );

        // WooCommerce billing last name.
        update_user_meta( $customer_id, 'billing_last_name', sanitize_text_field( $_POST['billing_last_name'] ) );
    }

    if ( isset( $_POST['billing_phone'] ) ) {
        // WooCommerce billing phone
        update_user_meta( $customer_id, 'billing_phone', sanitize_text_field( $_POST['billing_phone'] ) );
    }

    if ( isset( $_POST['reg_num'] ) ) {
        // WooCommerce billing address
        update_user_meta( $customer_id, 'reg_num', sanitize_text_field( $_POST['reg_num'] ) );
    }

    if ( isset( $_POST['Year_of_reg'] ) ) {
        // WooCommerce billing postcode
        update_user_meta( $customer_id, 'Year_of_reg', sanitize_text_field( $_POST['Year_of_reg'] ) );
    }

    if ( isset( $_POST['qualification'] ) ) {
        // WooCommerce billing city
        update_user_meta( $customer_id, 'qualification', sanitize_text_field( $_POST['qualification'] ) );
    }


}

add_action( 'woocommerce_created_customer', 'wooc_save_extra_register_fields' );
?>

Существует плагин под названием “WC Address Fields on User Registration”, который может сделать то, что вам нужно. Вы можете добавить поля для выставления счетов/доставки (имя, адрес, компания, телефон и т. д.) на стандартную страницу регистрации клиента Woocommerce – https://en-gb.wordpress.org/plugins/wc-afour/

.

Ответ или решение

Если вы пытаетесь создать настраиваемую страницу регистрации для WooCommerce и сталкиваетесь с проблемой сохранения данных в базе данных, я помогу вам разобраться, что может быть не так и как это исправить.

Проблемы в коде

Первое, что следует проверить в вашем коде, — это функции, ответственные за обработку и сохранение пользовательских данных при регистрации. В вашем коде представлены три основные части: добавление полей на форму, валидация введенных данных и сохранение данных в базе данных.

  1. Добавление полей на форму регистрации:
    Ваша функция wooc_extra_register_fields достаточно корректна и добавляет нужные поля на страницу регистрации. Однако убедитесь, что вы используете правильные имена полей для сохранения данных в базе данных, поскольку передача данных выполняется через POST-запрос.

  2. Валидация введенных данных:
    В функции wooc_validate_extra_register_fields вы добавляете ошибки, если поля не заполнены. На этом этапе все должно быть в порядке, но вы можете улучшить сообщения об ошибках, добавив URL для более подробного объяснения или указав конкретные шаги по исправлению ошибок.

  3. Сохранение данных при успешной регистрации:
    Основная проблема может заключаться в функции wooc_save_extra_register_fields. Убедитесь, что вы используете $customer_id, который передается в действие woocommerce_created_customer. Также проверьте, что поле, в которое вы сохраняете данные, существует в базе данных. Используйте функцию sanitize_text_field для устранения потенциальных уязвимостей.

Решение

Исправьте возможные проблемы с кодом, следуя рекомендациям:

  • Проверяйте, чтобы все имена полей формы совпадали с именами полей, используемых в $_POST.
  • Убедитесь, что хуки add_action вызываются во время инициализации WooCommerce (например, в файле темы functions.php).
  • Проверьте, правильно ли передается параметр $customer_id в функцию wooc_save_extra_register_fields.

Вот пример, как может выглядеть часть кода для добавления и сохранения данных:

add_action( 'woocommerce_register_form_start', 'wooc_extra_register_fields' );

// Валидация полей
add_action( 'woocommerce_register_post', 'wooc_validate_extra_register_fields', 10, 3 );

// Сохранение данных
add_action( 'woocommerce_created_customer', 'wooc_save_extra_register_fields' );

Альтернативное решение

Вместо ручного управления, вы можете использовать специальный плагин, такой как "WC Address Fields on User Registration", который позволит автоматически добавлять поля регистрации WooCommerce на страницу регистрации пользователя.

Ссылка на плагин "WC Address Fields on User Registration"

Заключение

Сосредоточьтесь на диагностике каждого этапа вашего решения: добавление полей, валидация и сохранение данных. Используйте сторонние плагины, чтобы сократить время на разработку и избежать ошибок, если у вас возникли трудности с ручной реализацией. Надеюсь, это поможет успешно внедрить настраиваемые поля регистрации на ваш сайт WooCommerce.

Оцените материал
Добавить комментарий

Капча загружается...