I recently was creating a website to sell tickets to an event. We waned people to automatically get a confirmation ticket as soon as they paid.
However, by default WooCommerce is built for physical products that need to be manually fulfilled by the seller. As a result, all orders are marked as “Pending”, and it’s up to you to switch their status to in-progress or completed based on your delivery.
(When a product is both virtual and downloadable, WooCommerce does mark it as complete, but in this case it was virtual but NOT downloadable. People got tickets in their email.)
For that, I found this simple code in the WooCommerece documentation, to automatically mark all orders as complete.
/**
* Auto Complete all WooCommerce orders.
*/
add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_order' );
function custom_woocommerce_auto_complete_order( $order_id ) {
if ( ! $order_id ) {
return;
}
$order = wc_get_order( $order_id );
$order->update_status( 'completed' );
}
The code above should be added to your functions.php file in a child theme, to prevent it from being overritted by a theme update.
If you need more advanced control, such as marking only virtual products as completed while leaving physical products as pending, there’s a plugin you can buy for that.
By the way, for my ticketing platform I used YITH’s WooCommerece event tickets plugin, which give you a lot of customization for selling access to physical and virtual events.