# Auto-Complete Paid Orders for Virtual Products

> Marks paid orders as Completed instead of Processing when every item is virtual, such as services, memberships or event tickets.

- Type: PHP
- Runs: Run everywhere
- Category: [WooCommerce](https://wpide.com/library/category/woocommerce/)
- Requires: WooCommerce
- Tags: woocommerce, orders, virtual, automation
- Author: WPIDE Team
- Installs: 0
- Updated: 2026-10-28
- Page: https://wpide.com/library/woo-autocomplete-virtual-orders/

## Code

```php
add_filter( 'woocommerce_payment_complete_order_status', function ( $status, $order_id, $order = null ) {
    if ( 'processing' !== $status ) {
        return $status;
    }

    $order = $order instanceof WC_Order ? $order : wc_get_order( $order_id );

    if ( ! $order || ! $order->get_items() ) {
        return $status;
    }

    foreach ( $order->get_items() as $item ) {
        $product = is_callable( array( $item, 'get_product' ) ) ? $item->get_product() : null;

        if ( ! $product || ! $product->is_virtual() ) {
            return $status;
        }
    }

    return 'completed';
}, 10, 3 );
```

## How to use it

Install the free WPIDE plugin (https://wordpress.org/plugins/wpide/), find "Auto-Complete Paid Orders for Virtual Products" in its snippet library and add it in one click; or create a new PHP snippet in WPIDE (or any code snippets plugin) and paste the code above. More snippets: https://wpide.com/library/
