Access customer custom user meta data in WooCommerce hooks

2.4k Views Asked by At

This question related to user_register hook

I needed to add some extra fields on the user registration form on woocommerce i used Custom User Registration Fields - WooCommerce plugin

My question here is how can i access to the value of those added fields with add_action hooks?

This is what i have done so far,

add_action( 'user_register', 'new_contact', 10, 3 );

function new_contact( $user_id ) {

    if ( isset( $_POST['first_name'] ) )
        update_user_meta($user_id, 'first_name', $_POST['first_name']);
    $customer = new WC_Customer( $user_id );
    echo $customer;
    
    wp_die();
    

}

the following is the echoed output:

{
"id":12,
"date_created":{"date":"2020-07-27 16:58:52.000000","timezone_type":1,"timezone":"+00:00"},
"date_modified":null,
"email":"[email protected]",
"first_name":""
,"last_name":"",
"display_name":"c",
"role":"customer",
"username":"c",
"billing":{"first_name":"","last_name":"","company":"","address_1":"","address_2":"","city":"","postcode":"","country":"","state":"","email":"","phone":""},
"shipping":{"first_name":"","last_name":"","company":"","address_1":"","address_2":"","city":"","postcode":"","country":"","state":""},
"is_paying_customer":false,
"meta_data":[
    {"id":516,"key":"afreg_additional_1564","value":"c"},
    {"id":517,"key":"afreg_additional_1565","value":"c"},
    {"id":518,"key":"afreg_additional_1566","value":"c"},
    {"id":519,"key":"afreg_additional_1555","value":"c"},
    {"id":520,"key":"afreg_additional_1556","value":"c"},
    {"id":521,"key":"afreg_additional_1557","value":"c"},
    {"id":522,"key":"afreg_additional_1558","value":"California"},
    {"id":523,"key":"afreg_additional_1559","value":"c"},
    {"id":524,"key":"afreg_additional_1560","value":"6181001010"},
    {"id":525,"key":"afreg_additional_1561","value":"c"},
    {"id":526,"key":"_yoast_wpseo_profile_updated","value":"1595894332"}
    ]
}

What i can see is that the custom fields that i added are stored inside "meta_data"

How could i store each value in a variable?

1

There are 1 best solutions below

0
On BEST ANSWER

You can access this meta data using WC_Data methods on the WC_Customer Object like:

  • get_meta_data() to get an unprotected array of WC_Meta_Data objects
  • get_meta($meta_key) To get the value from a specific meta key

To access the data from WC_Meta_Data object, you will use get_data() method.

So here is working example of code:

$user_id  = 12; // For user ID 12

// Get an instance of the WC_Customer Object from user Id
$customer = new WC_Customer( $user_id );

// Get the meta value from a specific meta key
$meta_value = $customer->get_meta('afreg_additional_1558');
echo 'Value: ' . $meta_value . '<br>'; //Display the value

// Get an unprotected array of `WC_Meta_Data` objects
$user_meta_data = $customer->get_meta_data();

// Loop through `WC_Meta_Data` objects
foreach( $customer->get_meta_data() as $meta_data ){
    // get an unprotected array of the current WC_Meta_Data object data
    $meta_data_array = $meta_data->get_data();
    
    $meta_key   = $meta_data_array['key']; // The meta key
    $meta_value = $meta_data_array['value']; // The meta value
    $meta_value = is_array($meta_value) ? implode(' | ', $meta_value) : $meta_value;
    
    // Testing output
    echo $meta_key  . ': ' . $meta_value . '<br>';
}

So In your function:

add_action( 'user_register', 'new_contact', 10, 3 );
function new_contact( $user_id ) {

    if ( isset( $_POST['first_name'] ) )
        update_user_meta($user_id, 'first_name', $_POST['first_name']);

    // Get an instance of the WC_Customer Object from user Id
    $customer = new WC_Customer( $user_id );
    
    // Get the meta value from a specific meta key
    $meta_value = $customer->get_meta('afreg_additional_1558');
    echo 'Value: ' . $meta_value . '<br>'; //Display the value
    
    // Get an unprotected array of `WC_Meta_Data` objects
    $user_meta_data = $customer->get_meta_data();
    
    // Loop through `WC_Meta_Data` objects
    foreach( $customer->get_meta_data() as $meta_data ){
        // get an unprotected array of the current WC_Meta_Data object data
        $meta_data_array = $meta_data->get_data();
        
        $meta_key   = $meta_data_array['key']; // The meta key
        $meta_value = $meta_data_array['value']; // The meta value
        $meta_value = is_array($meta_value) ? implode(' | ', $meta_value) : $meta_value;
        
        // Testing output
        echo $meta_key  . ': ' . $meta_value . '<br>';
    }
   
    // echo $customer;
    
    wp_die();
}

Or you can use the Wordpress way using get_user_meta() function to get an array of all user meta data:

add_action( 'user_register', 'new_contact', 10, 3 );
function new_contact( $user_id ) {

    if ( isset( $_POST['first_name'] ) )
        update_user_meta($user_id, 'first_name', $_POST['first_name']);

    // Get an instance of the WP_User Object from user Id
    $user = new WP_User( $user_id );
    
    // Get the meta value from a specific meta key
    $meta_value = $user->afreg_additional_1558;
    echo 'Value: ' . $meta_value . '<br>'; //Display the value

    // OR using 
    $meta_value = get_user_meta( $user_id, 'afreg_additional_1560', true );
    echo 'Value: ' . $meta_value . '<br>'; //Display the value
    
    // Get an array of all user meta data
    $user_meta_data = get_user_meta( $user_id );
    
    // Testing output meta data
    print_r( $user_meta_data );
    
    wp_die();
}

To get the correct meta keys for your related user meta data, you can also look to wp_usermeta database table.

To finish, as you can see now, it's easy to store each value in a variable, But your third party plugin, doesn't make things easy and explicit as each meta_key is a kind of internal id.