Woocommerce: Set checkout field values Woocommerce: Set checkout field values wordpress wordpress

Woocommerce: Set checkout field values


Filters allow you to modify information, but you must return that information from your function.

So, in this case, you're simply missing a return $fields; in your function:

function onboarding_update_fields( $fields = array() ) {   // check if it's set to prevent notices being thrown   $token = ( ! empty( $_GET['token'] ) ) ? $_GET['token'] : '';   // yoda-style to prevent accidental assignment   if( 'testtoken' == $token ) {       // if you are having issues, it's useful to do this below:       var_dump( $fields );       // remove the var_dump once you've got things working       // if all you want to change is the value, then assign ONLY the value       $fields['billing']['billing_first_name']['value'] = 'Joe';       // the way you were doing it before was removing core / required parts of the array - do not do it this way.       // $fields['billing']['billing_first_name']['value'] = array( 'value' => 'Joe');   }   // you must return the fields array    return $fields;}add_filter( 'woocommerce_checkout_fields', 'onboarding_update_fields' );

Update:
After seeing for some reason the above doesn't work, I sniffed some code on another plugin, and they way they do it (and it clearly works) is like so:

function onboarding_update_fields( $fields = array() ) {   $token = ( ! empty( $_GET['token'] ) ) ? $_GET['token'] : '';   if( 'testtoken' == $token ) {       // Assign the value to the $_POST superglobal       $_POST['billing_first_name'] = 'Joe';   }   return $fields;}

So - to be positive that this didn't overwrite / stomp user-entered information, I might suggest considering doing it something like this (of course test to be sure it works):

function onboarding_update_fields( $fields = array() ) {   $token = ( ! empty( $_GET['token'] ) ) ? $_GET['token'] : '';   if( 'testtoken' == $token ) {       // Assign the value to the $_POST superglobal ONLY if not already set       if ( empty( $POST['billing_first_name'] ) ) {           $_POST['billing_first_name'] = 'Joe';       }   }   return $fields;}


You should use this dedicated WooCommerce hook, made for prefilling checkout fields and defined in the WC_Checkout method get_value():

add_filter( 'woocommerce_checkout_get_value', 'populating_checkout_fields', 10, 2 );function populating_checkout_fields ( $value, $input ) {        $token = ( ! empty( $_GET['token'] ) ) ? $_GET['token'] : '';        if( 'testtoken' == $token ) {        // Define your checkout fields  values below in this array (keep the ones you need)        $checkout_fields = array(            'billing_first_name'    => 'John',            'billing_last_name'     => 'Wick',            'billing_company'       => 'Murders & co',            'billing_country'       => 'US',            'billing_address_1'     => '7 Random street',            'billing_address_2'     => 'Royal suite',            'billing_city'          => 'Los Angeles',            'billing_state'         => 'CA',            'billing_postcode'      => '90102',            'billing_phone'         => '555 702 666',            'billing_email'         => 'jhon.wick@murders.com',            'shipping_first_name'   => 'John',            'shipping_last_name'    => 'Wick',            'shipping_company'      => 'Murders & co',            'shipping_country'      => 'USA',            'shipping_address_1'    => '7 Random street',            'shipping_address_2'    => 'Royal suite',            'shipping_city'         => 'Los Angeles',            'shipping_state'        => 'California',            'shipping_postcode'     => '90102',            // 'account_password'       => '',            'order_comments'        => 'This is not for me',        );        foreach( $checkout_fields as $key_field => $field_value ){            if( $input == $key_field && ! empty( $field_value ) ){                $value = $field_value;            }        }    }    return $value;}

Code goes in function.php file of your active child theme (or theme) or also in any plugin file.

If user is not logged in, you could add additionally in your condition:

 if( 'testtoken' == $token &&  ! is_user_logged_in() ) {

This code is tested and works (but not tested with your specific code condition). For my testing I have used ! is_user_logged_in() as condition.

The you will get this (for the array defined in the function):

enter image description here


Please use 'default', like:

$fields['billing']['billing_first_name']['default'] = "Thomas";

Refer to WooCommerce | Set billing field value