Search code examples
phpwordpresswoocommercestatusemail-notifications

Add a new order status that Send an email notification in WooCommerce 4+


I would like to add a new order status and email notification to my site in conjunction with this order status. I tried this code:

// register a custom post status 'awaiting-delivery' for Orders
add_action( 'init', 'register_custom_post_status', 20 );
function register_custom_post_status() {
    register_post_status( 'wc-awaiting-delivery', array(
        'label'                     => _x( 'Kargoya Verildi', 'Order status', 'woocommerce' ),
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop( 'Kargoya Verildi <span class="count">(%s)</span>', 'Kargoya Verildi <span class="count">(%s)</span>', 'woocommerce' )
    ) );
}

// Adding custom status 'awaiting-delivery' to order edit pages dropdown
add_filter( 'wc_order_statuses', 'custom_wc_order_statuses', 20, 1 );
function custom_wc_order_statuses( $order_statuses ) {
    $order_statuses['wc-awaiting-delivery'] = _x( 'Kargoya Verildi', 'Order status', 'woocommerce' );
    return $order_statuses;
}

// Adding custom status 'awaiting-delivery' to admin order list bulk dropdown
add_filter( 'bulk_actions-edit-shop_order', 'custom_dropdown_bulk_actions_shop_order', 20, 1 );
function custom_dropdown_bulk_actions_shop_order( $actions ) {
    $actions['mark_awaiting-delivery'] = __( 'Kargoya Verildi', 'woocommerce' );
    return $actions;
}

// Adding action for 'awaiting-delivery'
add_filter( 'woocommerce_email_actions', 'custom_email_actions', 20, 1 );
function custom_email_actions( $action ) {
    $actions[] = 'woocommerce_order_status_wc-awaiting-delivery';
    return $actions;
}

add_action( 'woocommerce_order_status_wc-awaiting-delivery', array( WC(), 'send_transactional_email' ), 10, 1 );

// Sending an email notification when order get 'awaiting-delivery' status
add_action('woocommerce_order_status_awaiting-delivery', 'backorder_status_custom_notification', 20, 2);
function backorder_status_custom_notification( $order_id, $order ) {
    // HERE below your settings
    $heading   = __('Kargoya Verildi','woocommerce');
    $subject   = '[{site_title}] Siparişiniz Kargoya Verildi ({order_number}) - {order_date}';

    // Getting all WC_emails objects
    $mailer = WC()->mailer()->get_emails();

    // Customizing Heading and subject In the WC_email processing Order object
    $mailer['WC_Email_Customer_Processing_Order']->heading = $heading;
    $mailer['WC_Email_Customer_Processing_Order']->subject = $subject;

    // Sending the customized email
    $mailer['WC_Email_Customer_Processing_Order']->trigger( $order_id );
}

But the code doesn't send e-mail. How can I fix this situation? I tried a few other codes. But none of them worked.

NOTE: I am typing this code in the function.php file, do I need to write it somewhere different?


Solution

  • Based on this answer code and this unaccepted answer thread, Here is the revisited code, that will add a custom status to WooCommerce orders and will trigger a customized email notification for this custom status:

    // register a custom post status 'awaiting-delivery' for Orders
    add_action( 'init', 'register_custom_post_status', 20 );
    function register_custom_post_status() {
        register_post_status( 'wc-awaiting-delivery', array(
            'label'                     => _x( 'Kargoya Verildi', 'Order status', 'woocommerce' ),
            'public'                    => true,
            'exclude_from_search'       => false,
            'show_in_admin_all_list'    => true,
            'show_in_admin_status_list' => true,
            'label_count'               => _n_noop( 'Kargoya Verildi <span class="count">(%s)</span>', 'Kargoya Verildi <span class="count">(%s)</span>', 'woocommerce' )
        ) );
    }
    
    // Adding custom status 'awaiting-delivery' to order edit pages dropdown
    add_filter( 'wc_order_statuses', 'custom_wc_order_statuses' );
    function custom_wc_order_statuses( $order_statuses ) {
        $order_statuses['wc-awaiting-delivery'] = _x( 'Kargoya Verildi', 'Order status', 'woocommerce' );
        return $order_statuses;
    }
    
    // Adding custom status 'awaiting-delivery' to admin order list bulk dropdown
    add_filter( 'bulk_actions-edit-shop_order', 'custom_dropdown_bulk_actions_shop_order', 20, 1 );
    function custom_dropdown_bulk_actions_shop_order( $actions ) {
        $actions['mark_awaiting-delivery'] = __( 'Kargoya Verildi', 'woocommerce' );
        return $actions;
    }
    
    // Adding action for 'awaiting-delivery'
    add_filter( 'woocommerce_email_actions', 'custom_email_actions', 20, 1 );
    function custom_email_actions( $actions ) {
        $actions[] = 'woocommerce_order_status_wc-awaiting-delivery';
        return $actions;
    }
    
    add_action( 'woocommerce_order_status_wc-awaiting-delivery', array( WC(), 'send_transactional_email' ), 10, 1 );
    
    // Sending an email notification when order get 'awaiting-delivery' status
    add_action('woocommerce_order_status_awaiting-delivery', 'awaiting_delivery_order_status_email_notification', 20, 2);
    function awaiting_delivery_order_status_email_notification( $order_id, $order ) {
        // HERE below your settings
        $heading   = __('Kargoya Verildi','woocommerce');
        $subject   = '[{site_title}] Siparişiniz Kargoya Verildi ({order_number}) - {order_date}';
    
            // The email notification type
            $email_key   = 'WC_Email_Customer_Processing_Order';
    
            // Get specific WC_emails object
            $email_obj = WC()->mailer()->get_emails()[$email_key];
    
            // Sending the customized email
            $email_obj->trigger( $order_id );
    }
    
    // Customize email heading for this custom status email notification
    add_filter( 'woocommerce_email_heading_customer_processing_order', 'email_heading_customer_awaiting_delivery_order', 10, 2 );
    function email_heading_customer_awaiting_delivery_order( $heading, $order ){
        if( $order->has_status( 'awaiting-delivery' ) ) {
            $email_key   = 'WC_Email_Customer_Processing_Order'; // The email notification type
            $email_obj   = WC()->mailer()->get_emails()[$email_key]; // Get specific WC_emails object
            $heading_txt = __('Kargoya Verildi','woocommerce'); // New heading text
    
            return $email_obj->format_string( $heading_txt );
        }
        return $heading;
    }
    
    // Customize email subject for this custom status email notification
    add_filter( 'woocommerce_email_subject_customer_processing_order', 'email_subject_customer_awaiting_delivery_order', 10, 2 );
    function email_subject_customer_awaiting_delivery_order( $subject, $order ){
        if( $order->has_status( 'awaiting-delivery' ) ) {
            $email_key   = 'WC_Email_Customer_Processing_Order'; // The email notification type
            $email_obj   = WC()->mailer()->get_emails()[$email_key]; // Get specific WC_emails object
            $subject_txt = sprintf( __('[%s] Siparişiniz Kargoya Verildi (%s) - %s', 'woocommerce'), '{site_title}', '{order_number}', '{order_date}' ); // New subject text
    
            return $email_obj->format_string( $subject_txt );
        }
        return $subject;
    }
    

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