问题
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 $_POST
array 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