From 920418944885e49c6ec467d87d590b7861ee327f Mon Sep 17 00:00:00 2001 From: Dwindi Ramadhana Date: Wed, 7 Jan 2026 22:58:29 +0700 Subject: [PATCH] fix: add more hooks for license generation on order completion - Added woocommerce_payment_complete hook - Added woocommerce_thankyou hook for COD/virtual orders - Added is_virtual_order helper to detect virtual-only orders - generate_licenses_for_order now called from multiple hooks (safe due to license_exists_for_order_item check) --- includes/Modules/Licensing/LicenseManager.php | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/includes/Modules/Licensing/LicenseManager.php b/includes/Modules/Licensing/LicenseManager.php index 077597f..30e2e66 100644 --- a/includes/Modules/Licensing/LicenseManager.php +++ b/includes/Modules/Licensing/LicenseManager.php @@ -27,9 +27,46 @@ class LicenseManager { return; } - // Hook into order completion + // Hook into order completion - multiple hooks to catch all scenarios add_action('woocommerce_order_status_completed', [__CLASS__, 'generate_licenses_for_order']); add_action('woocommerce_order_status_processing', [__CLASS__, 'generate_licenses_for_order']); + add_action('woocommerce_payment_complete', [__CLASS__, 'generate_licenses_for_order']); + + // Also hook into thank you page for COD/pending orders (with lower priority) + add_action('woocommerce_thankyou', [__CLASS__, 'maybe_generate_on_thankyou'], 10); + } + + /** + * Maybe generate licenses on thank you page (for COD and pending orders) + */ + public static function maybe_generate_on_thankyou($order_id) { + if (!$order_id) return; + + $order = wc_get_order($order_id); + if (!$order) return; + + // Only generate for orders that didn't already get licenses via status hooks + // Check if it's a virtual-only order that might skip payment completion + $needs_payment = $order->needs_payment(); + $is_virtual = self::is_virtual_order($order); + + // Generate if: virtual order OR already paid (processing/completed) + if ($is_virtual || in_array($order->get_status(), ['processing', 'completed'])) { + self::generate_licenses_for_order($order_id); + } + } + + /** + * Check if order contains only virtual items + */ + private static function is_virtual_order($order) { + foreach ($order->get_items() as $item) { + $product = $item->get_product(); + if ($product && !$product->is_virtual()) { + return false; + } + } + return true; } /**