Search code examples
phpwordpresswoocommerceordersemail-notifications

Change Woocommerce email subject if order have this specific category


I just want to know if possible to change the email subject if the order have the specific category like (Preorder). I want to put PO at beginning (PO New customer order #0000) then all other order the customer receive the default email subject (New Customer Order #0000).

add_filter('woocommerce_email_subject_new_order', 'change_admin_email_subject', 1, 2);
function change_admin_email_subject( $subject, $order ) {

    global $woocommerce;
    global $product;       
    if ( has_term( 'preorder', $product->ID ) ) {           
        $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
        $subject = sprintf( '[%s]New customer order (# %s) from %s %s', $blogname, $order->id, $order->billing_first_name, $order->billing_last_name );
    } 
    return $subject;
}

Note: I just copy this code somewhere.


Solution

  • This can be done this way, making some small changes:

    add_filter('woocommerce_email_subject_new_order', 'custom_admin_email_subject', 1, 2);
    function custom_admin_email_subject( $subject, $order ) {
        $backordered = false;
    
        foreach($order->get_items() as $item_id => $item ){
            if ( has_term( 'preorder', 'product_cat' , $item->get_product_id() ) ) { 
                $backordered = true;
                break;
            }
        } 
        if ( $backordered ) {  
            $subject = sprintf( '[PO]New customer order (# %s) from %s %s', $order->get_id(), $order->get_billing_first_name(), $order->get_billing_last_name() );
        } 
        return $subject;
    }
    

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


    Or it can be done this way without a product category, checking that product is backordered:

    add_filter('woocommerce_email_subject_new_order', 'custom_admin_email_subject', 1, 2);
    function custom_admin_email_subject( $subject, $order ) {
        $backordered = false;
    
        foreach($order->get_items() as $item_id => $item ){
            $product = $item->get_product();
            if( $product->get_backorders() == 'yes' && $product->get_stock_quantity() < 0 ){
                $backordered = true;
                break;
            }
        }
        if ( $backordered ) {
            $subject = sprintf( '[PO]New customer order (# %s) from %s %s', $order->get_id(), $order->get_billing_first_name(), $order->get_billing_last_name() );
        }
        return $subject;
    }
    

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