Add custom user email to CC for specific Woocommer

2020-03-31 06:50发布

In Woocommerce I try to customize the code from this thread to add a custom email as "CC" email address in customer completed order email notification:

/**
 * Function adds a BCC header to emails that match our array
 * 
 * @param string $headers The default headers being used
 * @param string $object  The email type/object that is being processed
 */
    function add_cc_to_certain_emails( $headers, $object ) {
    // email types/objects to add cc to
    $cc_email = get_user_meta( $user_id, 'order_cc_email', true ); // MY CUSTOM CODE
    $add_cc_to = array(
        'customer_completed_order', // Customer Processing order from WooCommerce
    );
    // if our email object is in our array
    if ( in_array( $object, $add_cc_to ) ) {
        // change our headers
        $headers = array( 
            $headers,
//          'Cc: Me <me@example.com>' ."\r\n", // INITIAL CODE
            'Cc: '.$cc_email.' <'.$cc_email.'>' ."\r\n", // MY CUSTOM CODE
    }
    return $headers;
}
add_filter( 'woocommerce_email_headers', 'add_cc_to_certain_emails', 10, 2 );

I can't find the way to get custom user email from user meta data, and so my code doesn't work as expected.

How to get the custom user email from user meta data?

How to add this email (with the customer full name) as "CC" in email header?

2条回答
姐就是有狂的资本
2楼-- · 2020-03-31 07:19

There is some missing arguments in your hooked function, as woocommerce_email_headers filter hook allow 3 arguments:

  • $header ===> the header data to be return in this filter
  • $email_id==> the current WC_Email ID (but not the $object…)
  • $order ====> the instance of the WC_Order object (the missing useful one)

Try this revisited code instead:

add_filter( 'woocommerce_email_headers', 'custom_cc_email_headers', 10, 3 );
function custom_cc_email_headers( $header, $email_id, $order ) {

    // Only for "Customer Completed Order" email notification
    if( 'customer_completed_order' !== $email_id )
        return $header;

    // Get the custom email from user meta data  (with the correct User ID)
    $custom_user_email = get_user_meta( $order->get_user_id(), 'order_cc_email', true );

    if( ! empty($custom_email) ) 
        return $header; // Exit (if empty value)

    // Get customer billing full name
    $user_name  = $order->get_billing_first_name().' ';
    $user_name .= $order->get_billing_last_name();

    // Merge and prepare the data
    $formatted_email = utf8_decode($user_name . ' <' . $custom_user_email . '>');

    // Add Cc to headers
    $header .= 'Cc: '.$formatted_email .'\r\n';

    return $header;
}

Code goes in function.php file of your active child theme (or active theme). Tested and work.

Related threads:

查看更多
▲ chillily
3楼-- · 2020-03-31 07:22

I have modified the above code to include a second CC email address which is working for all notifications including a couple of custom emails I have set up, so thanks for the original code!

add_filter( 'woocommerce_email_headers', 'custom_cc_email_headers', 10, 3 );
function custom_cc_email_headers( $headers, $email_id, $order ) {

// Only for "Customer Completed Order" email notification
// if( 'wcj_custom_1' !== $email_id )
//    return $headers;

// Get the custom email from user meta data  (with the correct User ID)
$custom_user_email = get_user_meta( $order->get_user_id(), 'doc_email', true );
$bcc_email = get_user_meta( $order->get_user_id(), 'admin_email', true );

if( ! empty($custom_email) ) 
    return $headers; // Exit (if empty value)

// Get customer billing full name
$user_name  = $order->get_billing_first_name().' ';
$user_name .= $order->get_billing_last_name();

// Merge and prepare the data
$formatted_email = utf8_decode($user_name . ' <' . $custom_user_email . '>');
$formatted_email2 = utf8_decode($user_name . ' <' . $bcc_email . '>');

// Add Cc to headers
$headers .= 'Cc: '.$formatted_email ."\r\n";
$headers .= 'Cc: '.$formatted_email2."\r\n";

return $headers;
}

I do have a couple of questions, why is the below var declared as

$custom_email

and not, in the if statement

$custom_user_email

Also, would it also be possible to make this into an array of email IDs to apply the cc addresses to?

// Only for "Customer Completed Order" email notification
// if( 'wcj_custom_1' !== $email_id )
//    return $headers;

As in as array like this (found here)

$email_ids = array(
   'new_order',
   'cancelled_order',
   'failed_order',
   'customer_on_hold_order',
   'customer_processing_order',
   'customer_completed_order',
   'customer_refunded_order',
   'customer_invoice',
   'customer_note',
   'customer_reset_password',
   'customer_new_account',
  );

I have tried to incorporate these ideas into the existing code, but failing to get it to work.

查看更多
登录 后发表回答