Add Custom Order Status and Email Notifications in WooCommerce

Implement custom order statuses in WooCommerce with dedicated email notifications using register_post_status and custom email classes. Create tailored workflow statuses for your business needs, extend WC_Email class for custom email templates, and trigger automated emails when orders change to custom statuses. Complete guide with status registration, admin display, email triggers, and template creation for professional order management.

Add Custom Order Status & Emails in WooCommerce Easily

Code Snippets Coding Blog Custom Code Snippets PHP PHP Development Plugins Tech Tutorials Theme Optimization Tutorials Woocommerce WooCommerce Customization WooCommerce Development Woocommerce Hooks WooCommerce Tips Wordpress WordPress Development WordPress Hacks WordPress Tips WP Best Practices

Add Custom Order Status & Emails in WooCommerce Easily Tutorial/Guide

Enhancing your WooCommerce store with custom features allows you to better tailor it to your business needs. This tutorial will show you how to set up a custom order status and link it with personalized email notifications. With a few easy steps, you can fully integrate this new status into your store’s workflow.  

Step 1: Define Your Custom Order Status

Begin by registering a new status using register_post_status. Add the code below to your theme’s functions.php or within a custom plugin:

// Register a custom order status
function add_custom_order_status() {
    register_post_status( 'wc-custom-status', array(
        'label'                     => _x( 'Custom Status', 'Order status', 'your-text-domain' ),
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop( 'Custom Status (%s)', 'Custom Status (%s)', 'your-text-domain' )
    ) );
}
add_action( 'init', 'add_custom_order_status' );

Step 2: Display Status in Admin Orders List

Ensure your new status appears in the order filter dropdown with the wc_order_statuses filter:

// Add to admin order status filter
function add_custom_order_status_to_filter( $order_statuses ) {
    $order_statuses['wc-custom-status'] = _x( 'Custom Status', 'Order status', 'your-text-domain' );
    return $order_statuses;
}
add_filter( 'wc_order_statuses', 'add_custom_order_status_to_filter' );

Step 3: Register Email Trigger for Custom Status

Use woocommerce_email_actions to add a custom trigger:

// Email trigger for custom status
function add_custom_email_action( $email_actions ) {
    $email_actions[] = 'woocommerce_order_status_wc-custom-status';
    return $email_actions;
}
add_filter( 'woocommerce_email_actions', 'add_custom_email_action' );

Step 4: Create a Custom Email Handler Class

Next, build a class extending WC_Email. Save it as custom-new-order-email.php:

// custom-new-order-email.php
class Custom_New_Order_Email extends WC_Email {
    public function __construct() {
        $this->id             = 'custom_new_order';
        $this->title          = __( 'Custom New Order', 'your-text-domain' );
        $this->description    = __( 'Triggered when an order changes to your custom status.', 'your-text-domain' );
        $this->heading        = __( 'Custom New Order', 'your-text-domain' );
        $this->subject        = __( 'New Order: #{order_number}', 'your-text-domain' );
        $this->template_html  = 'emails/custom-new-order.php';
        $this->template_plain = 'emails/plain/custom-new-order.php';
        $this->template_base  = plugin_dir_path( __FILE__ );
        $this->placeholders   = array(
            '{order_number}' => '',
        );

        parent::__construct();
    }

    public function trigger( $order_id ) {
        $this->object = wc_get_order( $order_id );
        $this->recipient = $this->object->get_billing_email();
        $this->placeholders['{order_number}'] = $this->object->get_order_number();
        $this->heading = apply_filters( 'woocommerce_email_heading_' . $this->id, $this->heading, $this->object );
        $this->subject = apply_filters( 'woocommerce_email_subject_' . $this->id, $this->subject, $this->object );

        parent::trigger( $order_id );
    }
}

Step 5: Attach Custom Email to WooCommerce

Finally, register your email class via the woocommerce_email_classes filter:

// Add custom email class
function add_custom_email_class( $email_classes ) {
    require_once 'path/to/custom-new-order-email.php';
    $email_classes['Custom_New_Order_Email'] = new Custom_New_Order_Email();
    return $email_classes;
}
add_filter( 'woocommerce_email_classes', 'add_custom_email_class' );

Final Thoughts

You’ve now successfully added a custom order status in WooCommerce along with a dedicated email template. This approach helps improve communication with customers and streamline your workflow. Pro Tip: Always make changes using a child theme or a custom plugin. Test thoroughly before applying on your live store. Need more help? Check the official WooCommerce Email Customization Guide.  

๐Ÿ’ก Have a Coding Problem?

Search our archives or reach out to our team for solutions and expert advice.