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; } /**