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.