Populating Woocommerce Custom Fields

a 夏天 提交于 2020-01-15 04:00:11

问题


I'm having issues populating information gained through custom fields on a Woocommerce sign up page, when filling out the form the only things that seem to get pulled over are: First Name, Last Name, City, Postcode, Phone & Email Address.

When a user signs up for our site, they cannot immediately login as their account needs to be approved by an admin, the information pulling through will be used to contact the person prior to their account being activated.

I have tried dumping the $_POSTarray by using var_dump($_POST) but after making the change, none of the fields were working correctly.

Please see below what I'm currently using to add custom fields & to populate fields on the account page:

This is what I am using to add the custom fields to my woocommerce registration form:

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>
    <p class="form-row form-row-wide">
    <label for="reg_billing_company"><?php _e( 'Company', 'woocommerce' ); ?><span class="required"> *</span></label>
    <input type="text" class="input-text" name="billing_company" id="reg_billing_company" value="<?php esc_attr_e( $_POST['billing_company'] ); ?>" /></p>
    <p class="form-row form-row-wide">
    <label for="reg_billing_phone"><?php _e( 'Phone', 'woocommerce' ); ?><span class="required"> *</span></label>
    <input type="text" class="input-text" name="billing_phone" id="reg_billing_phone" value="<?php esc_attr_e( $_POST['billing_phone'] ); ?>" /></p>
    <p class="form-row form-row-wide">
    <label for="reg_billing_adress_1"><?php _e( 'Adress Line 1', 'woocommerce' ); ?><span class="required"> *</span></label>
    <input type="text" class="input-text" name="billing_adress_1" id="reg_billing_adress_1" value="<?php esc_attr_e( $_POST['billing_address_1'] ); ?>" />
    </p>
    <p class="form-row form-row-wide">
    <label for="reg_billing_adress_2"><?php _e( 'Adress Line 2', 'woocommerce' ); ?><span class="required"> *</span></label>
    <input type="text" class="input-text" name="billing_adress_2" id="reg_billing_adress_2" value="<?php esc_attr_e( $_POST['billing_address_2'] ); ?>" />
    </p>
    <p class="form-row form-row-wide">
    <label for="reg_billing_city"><?php _e( 'City', 'woocommerce' ); ?><span class="required"> *</span></label>
    <input type="text" class="input-text" name="billing_city" id="reg_billing_city" value="<?php esc_attr_e( $_POST['billing_city'] ); ?>" />
    </p>
    <p class="form-row form-row-wide">
    <label for="reg_billing_postcode"><?php _e( 'Postcode', 'woocommerce' ); ?><span class="required"> *</span></label>
    <input type="text" class="input-text" name="billing_postcode" id="reg_billing_postcode" value="<?php esc_attr_e( $_POST['billing_postcode'] ); ?>" />
    </p>
    <div class="clear"></div>
    <?php
 }
 add_action( 'woocommerce_register_form_start', 'wooc_extra_register_fields' );

This is what I'm using to populate the backend 'user' area once a user signs up:

function text_domain_woo_save_reg_form_fields($customer_id) {
    //First name field
    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']));
    }
    //Last name field
    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']));
    }
    //Phone Field
    if (isset($_POST['billing_phone'])) {
        update_user_meta($customer_id, 'phone', sanitize_text_field($_POST['billing_phone']));
        update_user_meta($customer_id, 'billing_phone', sanitize_text_field($_POST['billing_phone']));
    }
    //Billing Adress 1 Field
    if (isset($_POST['billing_adress_1'])) {
        update_user_meta($customer_id, 'address_1', sanitize_text_field($_POST['billing_address_1']));
        update_user_meta($customer_id, 'billing_address_1', sanitize_text_field($_POST['billing_address_1']));
    }
    //Billing Adress 2 Field
    if (isset($_POST['billing_adress_2'])) {
            update_user_meta($customer_id, 'address_2', sanitize_text_field($_POST['billing_address_2']));
            update_user_meta($customer_id, 'billing_address_2', sanitize_text_field($_POST['billing_address_2']));
    }
    //Billing City Field
    if (isset($_POST['billing_city'])) {
            update_user_meta($customer_id, 'city', sanitize_text_field($_POST['billing_city']));
            update_user_meta($customer_id, 'billing_city', sanitize_text_field($_POST['billing_city']));
    }
    //Billing Postcode Field
    if (isset($_POST['billing_postcode'])) {
            update_user_meta($customer_id, 'postcode', sanitize_text_field($_POST['billing_postcode']));
            update_user_meta($customer_id, 'billing_postcode', sanitize_text_field($_POST['billing_postcode']));
    }
}
add_action('woocommerce_created_customer', 'text_domain_woo_save_reg_form_fields');

I'm not the most experienced in PHP, so any help would be massively appreciated.


回答1:


There is some mistakes in your first hooked function. Also "Company" and "Address 2" fields shouldn't be required.

In your 2nd hooked function, "Company" is missing, so it's not saved anyway.

To finish You need an additional hooked function for fields required validation.

So your code should be:

// Add extra registration fields
add_action( 'woocommerce_register_form_start', 'woo_add_extra_registration_fields', 20 );
function woo_add_extra_registration_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>

    <p class="form-row form-row-wide">
        <label for="reg_billing_company"><?php _e( 'Company', 'woocommerce' ); ?></label>
        <input type="text" class="input-text" name="billing_company" id="reg_billing_company" value="<?php if ( ! empty( $_POST['billing_company'] ) ) esc_attr_e( $_POST['billing_company'] ); ?>" />
    </p>

    <p class="form-row form-row-wide">
        <label for="reg_billing_phone"><?php _e( 'Phone', 'woocommerce' ); ?><span class="required"> *</span></label>
        <input type="text" 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_billing_address_1"><?php _e( 'Address Line 1', 'woocommerce' ); ?><span class="required"> *</span></label>
        <input type="text" class="input-text" name="billing_address_1" id="reg_billing_address_1" value="<?php if ( ! empty( $_POST['billing_address_1'] ) ) esc_attr_e( $_POST['billing_address_1'] ); ?>" />
    </p>

    <p class="form-row form-row-wide">
        <label for="reg_billing_address_2"><?php _e( 'Adress Line 2', 'woocommerce' ); ?></label>
        <input type="text" class="input-text" name="billing_address_2" id="reg_billing_address_2" value="<?php if ( ! empty( $_POST['billing_address_2'] ) ) esc_attr_e( $_POST['billing_address_2'] ); ?>" />
    </p>

    <p class="form-row form-row-wide">
        <label for="reg_billing_city"><?php _e( 'City', 'woocommerce' ); ?><span class="required"> *</span></label>
        <input type="text" class="input-text" name="billing_city" id="reg_billing_city" value="<?php if ( ! empty( $_POST['billing_city'] ) ) esc_attr_e( $_POST['billing_city'] ); ?>" />
    </p>

    <p class="form-row form-row-wide">
        <label for="reg_billing_postcode"><?php _e( 'Postcode', 'woocommerce' ); ?><span class="required"> *</span></label>
        <input type="text" class="input-text" name="billing_postcode" id="reg_billing_postcode" value="<?php if ( ! empty( $_POST['billing_postcode'] ) ) esc_attr_e( $_POST['billing_postcode'] ); ?>" />
    </p>

    <div class="clear"></div>
    <?php
}

// Validate require additional registration fields
add_action( 'woocommerce_register_post', 'woo_extra_registration_fields_validation', 20, 3 );
function woo_extra_registration_fields_validation( $username, $email, $validation_errors ) {
    $domain = 'woocommerce';
    $error  = '<strong>' . __( 'Error', $domain ) . '</strong>: ';

    // Billing First name field
    if ( isset( $_POST['billing_first_name'] ) && empty( $_POST['billing_first_name'] ) )
        $validation_errors->add( 'billing_first_name_error', $error . __( 'First name is required!', $domain ) );

    // Billing Last name field
    if ( isset( $_POST['billing_last_name'] ) && empty( $_POST['billing_last_name'] ) )
        $validation_errors->add( 'billing_last_name_error', $error . __( 'Last name is required!.', $domain ) );

    // Billing Phone field
    if ( isset($_POST['billing_phone']) && empty( $_POST['billing_phone'] ) )
        $validation_errors->add( 'billing_phone_error', $error . __( 'Phone is required!.', $domain ) );

    // Billing Adress 1 Field
    if ( isset($_POST['billing_address_1']) && empty( $_POST['billing_address_1'] ) )
        $validation_errors->add( 'billing_address_1_error', $error . __( 'Address is required!.', $domain ) );

    // Billing City Field
    if ( isset($_POST['billing_city']) && empty( $_POST['billing_city'] ) )
        $validation_errors->add( 'billing_city_error', $error . __( 'City is required!.', $domain ) );

    // Billing Postcode Field
    if ( isset($_POST['billing_phone']) && empty( $_POST['billing_phone'] ) )
        $validation_errors->add( 'billing_postcode_error', $error . __( 'Postcode is required!.', $domain ) );

    return $validation_errors;
}

// Save extra registration fields data
add_action('woocommerce_created_customer', 'woo_save_extra_registration_fields_data', 20, 1 );
function woo_save_extra_registration_fields_data( $customer_id ) {

    // Billing First name field
    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'] ) );
    }
    // Billing Last name field
    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'] ) );
    }
    // Billing Company field
    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'] ) );
    }
    // Billing Phone Field
    if ( isset( $_POST['billing_phone'] ) ) {
        update_user_meta( $customer_id, 'phone', sanitize_text_field( $_POST['billing_phone'] ) );
        update_user_meta( $customer_id, 'billing_phone', sanitize_text_field( $_POST['billing_phone'] ) );
    }
    // Billing Adress 1 Field
    if ( isset( $_POST['billing_address_1'] ) ) {
        update_user_meta( $customer_id, 'address_1', sanitize_text_field( $_POST['billing_address_1'] ) );
        update_user_meta( $customer_id, 'billing_address_1', sanitize_text_field( $_POST['billing_address_1'] ) );
    }
    // Billing Adress 2 Field
    if ( isset( $_POST['billing_address_2'] ) ) {
        update_user_meta( $customer_id, 'address_2', sanitize_text_field( $_POST['billing_address_2'] ) );
        update_user_meta( $customer_id, 'billing_address_2', sanitize_text_field( $_POST['billing_address_2'] ) );
    }
    // Billing City Field
    if ( isset( $_POST['billing_city'] ) ) {
        update_user_meta( $customer_id, 'city', sanitize_text_field( $_POST['billing_city'] ) );
        update_user_meta( $customer_id, 'billing_city', sanitize_text_field( $_POST['billing_city'] ) );
    }
    // Billing Postcode Field
    if ( isset( $_POST['billing_postcode'] ) ) {
        update_user_meta( $customer_id, 'postcode', sanitize_text_field( $_POST['billing_postcode'] ) );
        update_user_meta( $customer_id, 'billing_postcode', sanitize_text_field( $_POST['billing_postcode'] ) );
    }
}

This code goes on function.php file of your active child theme (or theme). Tested and works.



来源:https://stackoverflow.com/questions/49170304/populating-woocommerce-custom-fields

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!