// Auto-complete virtual orders if payment is completed by u/acephaliax function auto_complete_virtual_orders($order_id) { if (!$order_id) { return; } // Get the order object $order = wc_get_order($order_id); // Check if the order contains virtual products $contains_virtual = false; foreach ($order->get_items() as $item) { $product = $item->get_product(); if ($product && $product->is_virtual()) { $contains_virtual = true; break; } } // Check if the payment is completed $payment_completed = $order->is_paid(); // If the order contains virtual products and the payment is completed, auto-complete it if ($contains_virtual && $payment_completed) { $order->update_status('completed'); } } add_action('woocommerce_order_status_changed', 'auto_complete_virtual_orders', 10, 3);