0

How do I combine these so I can autocomplete orders with only virtual subscriptions articles?

add_action( 'woocommerce_payment_complete', 'woocommerce_subscriptions_auto_complete_order' );
function woocommerce_subscriptions_auto_complete_order( $order_id ) { 
    if ( ! $order_id ) {
        return;
    }
    $order = wc_get_order( $order_id );
    $order->update_status( 'completed' );
}

and this which autocompletes virtual products. Although my subscriptions are virtual this didn't work

/**
 * Auto Complete all WooCommerce virtual orders.
 * 
 * @param  int  $order_id The order ID to check
 * @return void
 */
function custom_woocommerce_auto_complete_virtual_orders( $order_id ) {
    // if there is no order id, exit
    if ( ! $order_id ) {
        return;
    }
    // get the order and its exit
    $order = wc_get_order( $order_id );
    $items = $order->get_items();
    // if there are no items, exit
    if ( 0 >= count( $items ) ) {
        return;
    }
    // go through each item
    foreach ( $items as $item ) {
        // if it is a variation
        if ( '0' != $item['variation_id'] ) {
            // make a product based upon variation
            $product = new WC_Product( $item['variation_id'] );
        } else {
            // else make a product off of the product id
            $product = new WC_Product( $item['product_id'] );
        }
        // if the product isn't virtual, exit
        if ( ! $product->is_virtual() ) {
            return;
        }
    }
    /*
     * If we made it this far, then all of our items are virtual
     * We set the order to completed.
     */
    $order->update_status( 'completed' );
}
add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_virtual_orders' );

1 Answers1

0

I found an easier way at https://action-a-day.com/autocomplete-orders-in-woocommerce-3-0/

add_filter( 'woocommerce_order_item_needs_processing' , 'filter_woo_item_needs_processing', 10, 3 );

function filter_woo_item_needs_processing( $needs_processing, $product, $order_ID ) {
    $product_type = $product->get_type();
    if ( $product->is_virtual() 
    && ( 'subscription' == $product_type || 'subscription_variation' == $product_type || 'variable-subscription' == $product_type ) ) {
        return false;
    }

    return $needs_processing;
}