From d3e36688cd614935fddcf229876bb27caf4db867 Mon Sep 17 00:00:00 2001 From: dwindown Date: Tue, 18 Nov 2025 23:10:46 +0700 Subject: [PATCH] feat: Add all WooCommerce order status events Added missing order status events that were not showing in admin UI. New Events Added (Staff + Customer): - Order On-Hold (awaiting payment) - Order Failed (payment/processing failed) - Order Refunded (full refund processed) - Order Pending (initial order state) Changes: 1. EventRegistry.php - Added 8 new event definitions 2. DefaultTemplates.php - Added 8 new email templates 3. DefaultTemplates.php - Added subject lines for all new events Now Available in Admin: - Staff: 11 order events total - Customer: 12 events total (including new customer) All events can be toggled on/off per channel (email/push) in admin UI. --- includes/Core/Notifications/EventRegistry.php | 72 ++++++ includes/Email/DefaultTemplates.php | 239 ++++++++++++++++++ 2 files changed, 311 insertions(+) diff --git a/includes/Core/Notifications/EventRegistry.php b/includes/Core/Notifications/EventRegistry.php index 3cf53bf..e02109a 100644 --- a/includes/Core/Notifications/EventRegistry.php +++ b/includes/Core/Notifications/EventRegistry.php @@ -97,6 +97,42 @@ class EventRegistry { 'wc_email' => '', 'enabled' => true, ], + 'order_on_hold' => [ + 'id' => 'order_on_hold', + 'label' => __('Order On-Hold', 'woonoow'), + 'description' => __('When order is awaiting payment', 'woonoow'), + 'category' => 'orders', + 'recipient_type' => 'staff', + 'wc_email' => '', + 'enabled' => true, + ], + 'order_failed' => [ + 'id' => 'order_failed', + 'label' => __('Order Failed', 'woonoow'), + 'description' => __('When order fails', 'woonoow'), + 'category' => 'orders', + 'recipient_type' => 'staff', + 'wc_email' => 'failed_order', + 'enabled' => true, + ], + 'order_refunded' => [ + 'id' => 'order_refunded', + 'label' => __('Order Refunded', 'woonoow'), + 'description' => __('When order is refunded', 'woonoow'), + 'category' => 'orders', + 'recipient_type' => 'staff', + 'wc_email' => '', + 'enabled' => true, + ], + 'order_pending' => [ + 'id' => 'order_pending', + 'label' => __('Order Pending', 'woonoow'), + 'description' => __('When order is created (pending payment)', 'woonoow'), + 'category' => 'orders', + 'recipient_type' => 'staff', + 'wc_email' => '', + 'enabled' => true, + ], // CUSTOMER EVENTS 'order_placed_customer' => [ @@ -171,6 +207,42 @@ class EventRegistry { 'wc_email' => 'customer_new_account', 'enabled' => true, ], + 'order_on_hold_customer' => [ + 'id' => 'order_on_hold', + 'label' => __('Order On-Hold', 'woonoow'), + 'description' => __('When order is awaiting payment', 'woonoow'), + 'category' => 'orders', + 'recipient_type' => 'customer', + 'wc_email' => 'customer_on_hold_order', + 'enabled' => true, + ], + 'order_failed_customer' => [ + 'id' => 'order_failed', + 'label' => __('Order Failed', 'woonoow'), + 'description' => __('When order fails', 'woonoow'), + 'category' => 'orders', + 'recipient_type' => 'customer', + 'wc_email' => 'customer_failed_order', + 'enabled' => true, + ], + 'order_refunded_customer' => [ + 'id' => 'order_refunded', + 'label' => __('Order Refunded', 'woonoow'), + 'description' => __('When order is refunded', 'woonoow'), + 'category' => 'orders', + 'recipient_type' => 'customer', + 'wc_email' => 'customer_refunded_order', + 'enabled' => true, + ], + 'order_pending_customer' => [ + 'id' => 'order_pending', + 'label' => __('Order Pending', 'woonoow'), + 'description' => __('When order is created (pending payment)', 'woonoow'), + 'category' => 'orders', + 'recipient_type' => 'customer', + 'wc_email' => '', + 'enabled' => true, + ], ]; /** diff --git a/includes/Email/DefaultTemplates.php b/includes/Email/DefaultTemplates.php index 1295fa7..03fc76e 100644 --- a/includes/Email/DefaultTemplates.php +++ b/includes/Email/DefaultTemplates.php @@ -37,6 +37,10 @@ class DefaultTemplates { 'order_shipped' => self::customer_order_shipped(), 'order_completed' => self::customer_order_completed(), 'order_cancelled' => self::customer_order_cancelled(), + 'order_on_hold' => self::customer_order_on_hold(), + 'order_failed' => self::customer_order_failed(), + 'order_refunded' => self::customer_order_refunded(), + 'order_pending' => self::customer_order_pending(), 'payment_received' => self::customer_payment_received(), 'payment_failed' => self::customer_payment_failed(), 'new_customer' => self::customer_new_customer(), @@ -47,6 +51,10 @@ class DefaultTemplates { 'order_shipped' => self::staff_order_shipped(), 'order_completed' => self::staff_order_completed(), 'order_cancelled' => self::staff_order_cancelled(), + 'order_on_hold' => self::staff_order_on_hold(), + 'order_failed' => self::staff_order_failed(), + 'order_refunded' => self::staff_order_refunded(), + 'order_pending' => self::staff_order_pending(), 'payment_received' => self::staff_payment_received(), 'payment_failed' => self::staff_payment_failed(), ], @@ -77,6 +85,10 @@ class DefaultTemplates { 'order_shipped' => 'Your order #{order_number} is on its way', 'order_completed' => 'Your order #{order_number} has arrived', 'order_cancelled' => 'Your order #{order_number} has been cancelled', + 'order_on_hold' => 'Your order #{order_number} is on hold', + 'order_failed' => 'Your order #{order_number} has failed', + 'order_refunded' => 'Your order #{order_number} has been refunded', + 'order_pending' => 'Your order #{order_number} is pending', 'payment_received' => 'Payment confirmed for order #{order_number}', 'payment_failed' => 'Payment failed for order #{order_number}', 'new_customer' => 'Welcome to {site_name}!', @@ -87,6 +99,10 @@ class DefaultTemplates { 'order_shipped' => '[Order Shipped] #{order_number}', 'order_completed' => '[Order Completed] #{order_number}', 'order_cancelled' => '[Order Cancelled] #{order_number}', + 'order_on_hold' => '[Order On-Hold] #{order_number}', + 'order_failed' => '[Order Failed] #{order_number}', + 'order_refunded' => '[Order Refunded] #{order_number}', + 'order_pending' => '[Order Pending] #{order_number}', 'payment_received' => '[Payment Received] #{order_number} - {order_total}', 'payment_failed' => '[Payment Failed] #{order_number}', ], @@ -788,4 +804,227 @@ Order is reserved but will be cancelled automatically if payment is not received [/card]'; } + + // ======================================================================== + // ADDITIONAL ORDER STATUS TEMPLATES + // ======================================================================== + + /** + * Customer: Order On-Hold + */ + private static function customer_order_on_hold() { + return '[card type="info"] + +## Your order is on hold + +Your order #{order_number} is awaiting payment confirmation. + +[/card] + +[card] + +**Order Number:** #{order_number} +**Order Total:** {order_total} +**Payment Method:** {payment_method} + +[/card] + +[button url="{payment_retry_url}"]Complete Payment[/button] + +[card] + +Questions? Contact us: {support_email} + +[/card]'; + } + + /** + * Customer: Order Failed + */ + private static function customer_order_failed() { + return '[card type="warning"] + +## Order #{order_number} has failed + +Unfortunately, your order could not be processed. + +[/card] + +[card] + +**Order Number:** #{order_number} +**Order Total:** {order_total} +**Reason:** Payment could not be processed + +[/card] + +[button url="{shop_url}"]Continue Shopping[/button] + +[card] + +Need help? Contact: {support_email} + +[/card]'; + } + + /** + * Customer: Order Refunded + */ + private static function customer_order_refunded() { + return '[card type="success"] + +## Your order #{order_number} has been refunded + +Your refund has been processed successfully. + +[/card] + +[card] + +**Order Number:** #{order_number} +**Refund Amount:** {order_total} +**Refund Date:** {order_date} + +[/card] + +[card type="info"] + +The refund will appear in your account within 5-10 business days depending on your payment provider. + +[/card] + +[card] + +Questions? Contact: {support_email} + +[/card]'; + } + + /** + * Customer: Order Pending + */ + private static function customer_order_pending() { + return '[card type="info"] + +## Thank you for your order! + +Your order #{order_number} is pending and will be processed once payment is confirmed. + +[/card] + +[card] + +**Order Number:** #{order_number} +**Order Total:** {order_total} +**Payment Method:** {payment_method} + +[/card] + +[card] + +{order_items_table} + +[/card] + +[button url="{order_url}"]View Order[/button] + +[card] + +Questions? Contact: {support_email} + +[/card]'; + } + + /** + * Staff: Order On-Hold + */ + private static function staff_order_on_hold() { + return '[card type="info"] + +## Order #{order_number} is on hold + +Awaiting payment confirmation from {customer_name}. + +[/card] + +[card] + +**Order Number:** #{order_number} +**Customer:** {customer_name} +**Order Total:** {order_total} +**Payment Method:** {payment_method} + +[/card] + +[button url="{order_url}"]View Order[/button]'; + } + + /** + * Staff: Order Failed + */ + private static function staff_order_failed() { + return '[card type="warning"] + +## Order #{order_number} has failed + +Order from {customer_name} could not be processed. + +[/card] + +[card] + +**Order Number:** #{order_number} +**Customer:** {customer_name} +**Order Total:** {order_total} + +[/card] + +[button url="{order_url}"]View Details[/button]'; + } + + /** + * Staff: Order Refunded + */ + private static function staff_order_refunded() { + return '[card type="success"] + +## Order #{order_number} has been refunded + +Refund processed for {customer_name}. + +[/card] + +[card] + +**Order Number:** #{order_number} +**Customer:** {customer_name} +**Refund Amount:** {order_total} + +[/card] + +[button url="{order_url}"]View Order[/button]'; + } + + /** + * Staff: Order Pending + */ + private static function staff_order_pending() { + return '[card type="info"] + +## New pending order #{order_number} + +Order from {customer_name} is pending payment. + +[/card] + +[card] + +**Order Number:** #{order_number} +**Customer:** {customer_name} +**Order Total:** {order_total} + +[/card] + +[button url="{order_url}"]View Order[/button]'; + } }