Hide payment method based on product type in WooCommerce Hide payment method based on product type in WooCommerce wordpress wordpress

Hide payment method based on product type in WooCommerce


Here is an example with a custom hooked function in woocommerce_available_payment_gateways filter hook, where I can disable payment gateways based on the cart items (product type):

add_filter('woocommerce_available_payment_gateways', 'conditional_payment_gateways', 10, 1);function conditional_payment_gateways( $available_gateways ) {    // Not in backend (admin)    if( is_admin() )         return $available_gateways;    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item ) {        $prod_variable = $prod_simple = $prod_subscription = false;        // Get the WC_Product object        $product = wc_get_product($cart_item['product_id']);        // Get the product types in cart (example)        if($product->is_type('simple')) $prod_simple = true;        if($product->is_type('variable')) $prod_variable = true;        if($product->is_type('subscription')) $prod_subscription = true;    }    // Remove Cash on delivery (cod) payment gateway for simple products    if($prod_simple)        unset($available_gateways['cod']); // unset 'cod'    // Remove Paypal (paypal) payment gateway for variable products    if($prod_variable)        unset($available_gateways['paypal']); // unset 'paypal'    // Remove Bank wire (Bacs) payment gateway for subscription products    if($prod_subscription)        unset($available_gateways['bacs']); // unset 'bacs'    return $available_gateways;}

Code goes in function.php file of your active child theme (or theme) or also in any plugin file.

All code is tested on Woocommerce 3+ and works.

This is just an example to show you how things can work. You will have to adapt it


This code has been very useful to me, but there is an error in it that I had to fix: the line

 $prod_variable = $prod_simple = $prod_subscription = false;

must be put OUTSIDE (before) the FOREACH otherwise it will reset the flag everytime a new item is executed. I my case, I needed to unset a specific payment method whenever a subscription product was on the cart. As it is, this code will work only if there is just a single subscription product. If I put another different item on cart, the flag will be turn to false again and the payment method will load. Putting the line outside the FOREACH will fix this problem.