Ever wondered if you could toggle payment gateways based on whether a given “product type” is in the WooCommerce Cart? For example, disable PayPal if there are simple subscription products, or enable Stripe only when there are variable products?
Well, with this simple code (and the 2 examples) you find below, you can manage to achieve just that. The second example regards the WooCommerce Subscriptions plugin, as this requires some plugin-specific functions to check for the product type. Enjoy!

PHP Snippet 1: Disable Payment Gateway Based on Product Type e.g. “Simple” Product @ WooCommerce Checkout
In this example, we unset “paypal” in case there are “simple” products in the cart. You can also use “grouped” and “variable” (“external” doesn’t count as it requires no on-site payment), as well as other custom type keys added by third party plugins.
/**
* @snippet Disable WooCommerce Payment Gateway By Product Type
* @how-to businessbloomer.com/woocommerce-customization
* @author Rodolfo Melogli, Business Bloomer
* @compatible WooCommerce 7
* @community https://businessbloomer.com/club/
*/
add_filter( 'woocommerce_available_payment_gateways', 'bbloomer_disable_payment_by_product_type' );
function bbloomer_disable_payment_by_product_type( $available_gateways ) {
if ( ! WC()->cart ) return $available_gateways;
$types = array();
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
$product = $cart_item['data'];
$types[] = $product->get_type() ? $product->get_type() : null;
}
$types = array_unique( $types );
if ( in_array( 'simple', $types ) && isset( $available_gateways['paypal'] ) ) {
unset( $available_gateways['paypal'] );
}
return $available_gateways;
}
PHP Snippet 2: Disable Payment Gateway Based on WooCommerce Subscriptions Product Type e.g. “Simple Subscription” @ WooCommerce Checkout
In this example, we unset “paypal” in case there are “simple subscription” products in the cart (WooCommerce Subscriptions plugin).
/**
* @snippet Disable WooCommerce Payment Gateway By Subscription Product Type
* @how-to businessbloomer.com/woocommerce-customization
* @author Rodolfo Melogli, Business Bloomer
* @compatible WooCommerce 7
* @community https://businessbloomer.com/club/
*/
add_filter( 'woocommerce_available_payment_gateways', 'bbloomer_disable_payment_by_subscription_product_type' );
function bbloomer_disable_payment_by_subscription_product_type( $available_gateways ) {
if ( class_exists( 'WC_Subscriptions_Cart' ) && WC_Subscriptions_Cart::cart_contains_subscription() && isset( $available_gateways['paypal'] ) ) {
unset( $available_gateways['paypal'] );
}
return $available_gateways;
}
Thanks, this is great! But now with the block checkout, it appears that the “woocommerce_available_payment_gateways” hook doesn’t do the trick. When the checkout initially loads, the unset gateway is gone, but if a user changes any form fields and scrolls back down to the payment methods, the unset gateway appears again.
Is there a new hook for this for the block checkout?
I’m asking around, but your best bet at the moment is to revert to the legacy/classic checkout