Woocommerce - Need to send email to specific addre

2020-02-11 12:39发布

问题:

Basically, in woocommerce you have the option to input multiple email addresses (separated by commas) of who to send the completed order to, in WooCommerce -> Settings -> Emails -> New order. But I need a way to send to only one of these recipients based on the zip code of the customer who is ordering the product. Or completely overwrite woocommerce's way of handling this.

How can I tie into the function responsible for this, in order to send to the correct recipient? Basically, is there a hook defined for this, or does a plugin exist for something like this, or will I have to edit core WooCommerce files? If edits are needed to core files, can someone point me in the right direction as to which files will need edits?

回答1:

Each email has a filter that allows you to adjust the recipients of that email. The filter name is essentially woocommerce_email_recipient_{$email_id}.

So the following would filter the "to" addresses for the "new_order" email.

add_filter( 'new_order' , 'so_26429482_add_recipient', 20, 2 );
function so_26429482_add_recipient( $email, $order ) {
    $additional_email = "somebody@somewhere.net";
    if( $order->shipping_postcode == "90210" ){
        $email = explode( ',', $email );
        array_push( $email, $additional_email );
    }
    return $email;
}

I'm not 100% certain on the conditional logic, but I think that should check the shipping zip code and subsequently send to the additional email address.



回答2:

I had a bit of trouble with helgatheviking's answer above and also a slightly different use case. My problems/needs were:

  • I didn't quite understand the filter name as presented above.
  • The public function get_recipient() inside of class-wc-email.php expected a string but was getting an array.
  • A also wanted to conditionally add the extra recipient based on the payment method, rather than postcode.

Here's what I did instead:

  • Added full filter name, not just the suffix: add_filter( 'woocommerce_email_recipient_new_order' , 'so_26429482_add_recipient', 20, 2 );
  • Replaced explode() and array_push() with string concatenation $email .= ',' . $additional_email;.
  • Conditionally checked the payment method using if( $order->get_payment_method() == "cod" ) { //code }.

Full example:

/* Add ISF Email copies */
add_filter( 'woocommerce_email_recipient_new_order' , 'so_26429482_add_recipient', 20, 2 );
function so_26429482_add_recipient( $email, $order ) {

//!empty($order) prevents a fatal error in WooCommerce Settings
//!empty($email) prevents the duplicate email from being sent in cases where the filter is run outside of when emails are normally sent. In my case, when using https://wordpress.org/plugins/woo-preview-emails/.
if(!empty($order) && !empty($email)) {

    $additional_email = "isf@ptdev.co";

    if( $order->get_payment_method() == "cod" ){        
        $email .= ',' . $additional_email;
    } else {            
        $email .= ',h7@ptdev.co';
    }

} //if not empty

//error_log('Payment Method: ' . $order->get_payment_method(), 0);

return $email;

}