Ok, we all know that Stripe, PayPal and all successful online payment orders go to “processing” order status, BACS and cheque go to “on-hold“, and so on. Each payment gateway has its own default paid status.
Now, what if you use custom order statuses, or what if you wish to change Stripe orders to “completed“, BACS orders to “pending” and PayPal orders to “on-hold“?
Thankfully, this is super easy with a handy PHP snippet. Enjoy!
Before coding…
To make this customization, you will need to know if the target payment gateway PHP class comes with a “process_payment_order_status” filter.
Each payment gateway, whether it’s included in WooCommerce core or not, should provide you with a handy filter hook called “woocommerce_GATEWAYID_process_payment_order_status“, where GATEWAYID is the payment gateway ID.
For example, this is the code for the bank transfer (BACS) gateway, which is included within WooCommerce core:
if ( $order->get_total() > 0 ) {
// Mark as on-hold (we're awaiting the payment).
$order->update_status( apply_filters( 'woocommerce_bacs_process_payment_order_status', 'on-hold', $order ), __( 'Awaiting BACS payment', 'woocommerce' ) );
}
For cheque payment gateway, you’ll need to use woocommerce_cheque_process_payment_order_status – for the official Stripe plugin woocommerce_stripe_process_payment_order_status – and so on.
Now that we have the filters, we can change the default “process payment” order status!
PHP Snippet 1: Change Default Paid Order Status for BACS Payment Gateway
/**
* @snippet BACS Order Status
* @how-to businessbloomer.com/woocommerce-customization
* @author Rodolfo Melogli, Business Bloomer
* @compatible WooCommerce 9
* @community https://businessbloomer.com/club/
*/
add_filter( 'woocommerce_bacs_process_payment_order_status', 'bbloomer_change_bacs_order_status', 9999, 2 );
function bbloomer_change_bacs_order_status( $status, $order ) {
return 'pending';
}
PHP Snippet 2: Change Default Paid Order Status for CHEQUE Payment Gateway
/**
* @snippet CHEQUE Order Status
* @how-to businessbloomer.com/woocommerce-customization
* @author Rodolfo Melogli, Business Bloomer
* @compatible WooCommerce 9
* @community https://businessbloomer.com/club/
*/
add_filter( 'woocommerce_cheque_process_payment_order_status', 'bbloomer_change_cheque_order_status', 9999, 2 );
function bbloomer_change_cheque_order_status( $status, $order ) {
return 'processing';
}
PHP Snippet 3: Change Default Paid Order Status for STRIPE Payment Gateway
/**
* @snippet STRIPE Order Status
* @how-to businessbloomer.com/woocommerce-customization
* @author Rodolfo Melogli, Business Bloomer
* @compatible WooCommerce 9
* @community https://businessbloomer.com/club/
*/
add_filter( 'woocommerce_stripe_process_payment_order_status', 'bbloomer_change_stripe_order_status', 9999, 2 );
function bbloomer_change_stripe_order_status( $status, $order ) {
return 'custom';
}
Hello,
I put this at the end of my functions child theme:
The gateway payment is named: wompi
And I need that all the orders will be on “on-hold” rather “payment pending”, but It doesn’t work 🙁
What could be the error?
You first need to check if the Wompi plugin gives you that filter (woocommerce_wompi_process_payment_order_status), otherwise this won’t work I’m afraid
Hi, through another set of pages I setup the following snip, but its not working:
I want when a customer chooses to pay through Email Transfer (Interac) to go ahead and set the order status to “Pending etransfer”.
– My custom gateway name is “custom_b9599316cc4fd28”.
– My custom status slug is “pending-etransfer”.
Any help is greatly appreciated.
Hello Peter, thanks so much for your comment! Yes, this is definitely doable, but I’m afraid it’s custom work. If you’d like to get a quote, feel free to contact me here. Thanks a lot for your understanding!
Hi,
here is the case that I have, sorry for the long writing but it is important to understand the situation 1st.
The plugin used: WooCommerce Stripe Gateway by woocommerce
Methods enabled: Credit Cards/ Debit cards
Capture method: Authorize on sale ONLY on sale, capture payment when order status is “processing” and void the payment if order status is “canceled”, refund if the order is marked refund via stripe, these are the default Stripe plugin and they work perfectly fine,
The problem:
if an order is successfully authorized on a sale, the order status changes to “pending” and if the customer goes to his orders page and clicks the order number, once clicked, that order page keeps on reloading and triggers an order confirmation email to the admin and customer email ENDLESSLY until the customer clicks away from that order page OR if the admin approves the payment by “processing” the order or changes the order status to any other custom status such as “payment-authorize”, only then the customer will be able to open/load his order page and see order details, that wasn’t happening with other payment gateways by the way, not sure why is this happening now with stripe,
I created a custom status under “payment Authorized” with a slug “payment-authorize”
logic that’s needed with a snippet:
I want to change the order status automatically to “Payment Authorized” ONLY IF payment is successfully authorized on sale by stripe ((credit cards /debit cards))
can we achieve that with a snippet?
Hi Sam, thanks so much for your comment! Yes, this is definitely possible, but I’m afraid it’s custom work. If you’d like to get a quote, feel free to contact me here. Thanks a lot for your understanding!
Hello, this is what I am looking for for bank transfer payments, thank you.
Is it possible to replace return ‘pending’; by “awaiting payment”? If yes, what to replace pending?
Great! This should help: https://www.businessbloomer.com/woocommerce-rename-completed-order-status/