phpwordpresswoocommerceemail-notificationsuser-data

Send an email notification with the generated password on WooCommerce user creation


In WooCommerce with code below I create new WP_User with a random password and set user role to "customer" (I want to create account on purchase automatically). Then I use WC_Emails to send login details to buyer. In that case I need plain password, but I really don't know why all other data are attached (username, name,...), but the password remains empty on the email notification.

My code is:

  // random password with 12 chars
$user_pass = wp_generate_password();

// create new user with email as username & newly created pw
$user_id = wp_create_user( $order_email, $user_pass, $order_email );
$user_id_role = new WP_User($user_id);
$user_id_role->set_role('customer');


$wc = new WC_Emails();
$wc->customer_new_account($user_id, $user_pass);




//WC guest customer identification
update_user_meta( $user_id, 'guest', 'yes' );

update_user_meta( $user_id, 'first_name', $order->billing_first_name );
update_user_meta( $user_id, 'last_name', $order->billing_last_name );


//user's billing data
update_user_meta( $user_id, 'billing_address_1', $order->billing_address_1 );
update_user_meta( $user_id, 'billing_address_2', $order->billing_address_2 );
update_user_meta( $user_id, 'billing_city', $order->billing_city );
update_user_meta( $user_id, 'billing_company', $order->billing_company );
update_user_meta( $user_id, 'billing_country', $order->billing_country );
update_user_meta( $user_id, 'billing_email', $order->billing_email );
update_user_meta( $user_id, 'billing_first_name', $order->billing_first_name );
update_user_meta( $user_id, 'billing_last_name', $order->billing_last_name );
update_user_meta( $user_id, 'billing_phone', $order->billing_phone );
update_user_meta( $user_id, 'billing_postcode', $order->billing_postcode );
update_user_meta( $user_id, 'billing_state', $order->billing_state );

// user's shipping data
update_user_meta( $user_id, 'shipping_address_1', $order->shipping_address_1 );
update_user_meta( $user_id, 'shipping_address_2', $order->shipping_address_2 );
update_user_meta( $user_id, 'shipping_city', $order->shipping_city );
update_user_meta( $user_id, 'shipping_company', $order->shipping_company );
update_user_meta( $user_id, 'shipping_country', $order->shipping_country );
update_user_meta( $user_id, 'shipping_first_name', $order->shipping_first_name );
update_user_meta( $user_id, 'shipping_last_name', $order->shipping_last_name );
update_user_meta( $user_id, 'shipping_method', $order->shipping_method );
update_user_meta( $user_id, 'shipping_postcode', $order->shipping_postcode );
update_user_meta( $user_id, 'shipping_state', $order->shipping_state );

// link past orders to this newly created customer
wc_update_new_customer_past_orders( $user_id );

Any help or suggestions are highly appreciated.


Solution

  • There are some mistakes in your code regarding WC_Order properties that are not accessible anymore since WooCommerce 3 and replaced by getter and setter methods, see this thread

    As you are creating some users programmatically, to send the Customer New Account email notification, you can use WC_Email_Customer_New_Account trigger() method that has 3 arguments variables:

    To make the generated password displayed in "Customer New Account" email notification, you also need to enable in WooCommerce > Settings > Accounts & Privacy the option line:

    "When creating an account, automatically generate an account password"

    Once done, your working code is going to be:

    // Customer Billing Email
    $order_email = $order->get_billing_email();
    
    // Generate a random password with 12 chars
    $user_pass = wp_generate_password();
    
    // Create new user with email as username & newly generated password
    $user_id = wp_create_user( $order_email, $user_pass, $order_email );
    
    $user = new WP_User($user_id); // Get the WP_User Object instance from user ID
    $user->set_role('customer');   // Set the WooCommerce "customer" user role
    
    // Get all WooCommerce emails Objects from WC_Emails Object instance
    $emails = WC()->mailer()->get_emails();
    
    // Send WooCommerce "Customer New Account" email notification with the password
    $emails['WC_Email_Customer_New_Account']->trigger( $user_id, $user_pass, true );
    
    //WC guest customer identification
    update_user_meta( $user_id, 'guest', 'yes' );
    
    update_user_meta( $user_id, 'first_name', $order->$order->get_billing_first_name() );
    update_user_meta( $user_id, 'last_name', $order->get_billing_last_name() );
    
    
    //user's billing data
    update_user_meta( $user_id, 'billing_address_1', $order->get_billing_address_1() );
    update_user_meta( $user_id, 'billing_address_2', $order->get_billing_address_2() );
    update_user_meta( $user_id, 'billing_city', $order->get_billing_city() );
    update_user_meta( $user_id, 'billing_company', $order->get_billing_company() );
    update_user_meta( $user_id, 'billing_country', $order->get_billing_country() );
    update_user_meta( $user_id, 'billing_email', $order_email );
    update_user_meta( $user_id, 'billing_first_name', $order->get_billing_first_name() );
    update_user_meta( $user_id, 'billing_last_name', $order->get_billing_last_name() );
    update_user_meta( $user_id, 'billing_phone', $order->get_billing_phone() );
    update_user_meta( $user_id, 'billing_postcode', $order->get_billing_postcode() );
    update_user_meta( $user_id, 'billing_state', $order->get_billing_state() );
    
    // user's shipping data
    update_user_meta( $user_id, 'shipping_address_1', $order->get_shipping_address_1() );
    update_user_meta( $user_id, 'shipping_address_2', $order->get_shipping_address_2() );
    update_user_meta( $user_id, 'shipping_city', $order->get_shipping_city() );
    update_user_meta( $user_id, 'shipping_company', $order->get_shipping_company() );
    update_user_meta( $user_id, 'shipping_country', $order->get_shipping_country() );
    update_user_meta( $user_id, 'shipping_first_name', $order->get_shipping_first_name() );
    update_user_meta( $user_id, 'shipping_last_name', $order->get_shipping_last_name() );
    update_user_meta( $user_id, 'shipping_method', $order->get_shipping_method() );
    update_user_meta( $user_id, 'shipping_postcode', $order->get_shipping_postcode() );
    update_user_meta( $user_id, 'shipping_state', $order->get_shipping_state() );
    
    // link past orders to this newly created customer
    wc_update_new_customer_past_orders( $user_id );
    

    Now as you will see a notification is sent to the customer, with its login and password, with the link to the login area...

    enter image description here


    Template customizations for "Customer new account email":

    The related template path is plugins/woocommerce/templates/emails/customer-new-account.php and can be overridden by copying it to yourtheme/woocommerce/emails/customer-new-account.php

    The available arguments (variables) passed to this template are: