I’ve manged to get this code to work for removing ONE payment gateway based on one or more product categories.
What I need help with is removing multiple payment gateways as well. In other words; it should remove one or more payment gateways based on one or more product categories.
This is what I got, which might be outdated?
add_filter( 'woocommerce_available_payment_gateways', 'remove_gateway_based_on_category' ); function remove_gateway_based_on_category($available_gateways){ global $woocommerce; if (is_admin() && !defined('DOING_AJAX')) return; if (!(is_checkout() && !is_wc_endpoint_url())) return; $unset = false; $category_ids = array( '75' ); foreach ($woocommerce->cart->cart_contents as $key => $values){ $terms = get_the_terms($values['product_id'], 'product_cat'); foreach ($terms as $term){ if (in_array($term->term_id, $category_ids)){ $unset = true; break; } } } if ($unset == true) unset($available_gateways['cod']); return $available_gateways; }
Advertisement
Answer
Yes it’s possible to disable payment gateways for groups of multiple product categories.
1) In the separated function below we define our groups of product categories and payment gateways. The product categories can be either term(s) id(s), slug(s) or name(s). So in this function we define our settings, to be used:
// The settings in a function function defined_categories_remove_payment_gateways() { // Below, Define by groups the categories that will removed specific defined payment gateways // The categories can be terms Ids, slugs or names return array( 'group_1' => array( 'categories' => array( 11, 12, 16 ), // product category terms 'payment_ids' => array( 'cod' ), // <== payment(s) gateway(s) to be removed ), 'group_2' => array( 'categories' => array( 13, 17, 15 ), // product category terms 'payment_ids' => array( 'bacs', 'cheque' ), // <== payment(s) gateway(s) to be removed ), 'group_3' => array( 'categories' => array( 14, 19, 47 ), // product category terms 'payment_ids' => array( 'paypal' ), // <== payment(s) gateway(s) to be removed ), ); }
2) Now the hooked function that will remove, in checkout page, the payment gateways based on the cart items product categories, loading our settings function:
add_filter( 'woocommerce_available_payment_gateways', 'remove_gateway_based_on_category' ); function remove_gateway_based_on_category( $available_gateways ){ // Only on checkout page if ( is_checkout() && ! is_wc_endpoint_url() ) { $settings_data = defined_categories_remove_payment_gateways(); // Load settings $unset_gateways = []; // Initializing // 1. Loop through cart items foreach ( WC()->cart->get_cart() as $cart_item ) { // 2. Loop through category settings foreach ( $settings_data as $group_values ) { // // Checking the item product category if ( has_term( $group_values['categories'], 'product_cat', $cart_item['product_id'] ) ) { // Add the payment gateways Ids to be removed to the array $unset_gateways = array_merge( $unset_gateways, $group_values['payment_ids'] ); break; // Stop the loop } } } // Check that array of payment Ids is not empty if ( count($unset_gateways) > 0 ) { // 3. Loop through payment gateways to be removed foreach ( array_unique($unset_gateways) as $payment_id ) { if( isset($available_gateways[$payment_id]) ) { // Remove the payment gateway unset($available_gateways[$payment_id]); } } } } return $available_gateways; }
Code goes in functions.php file of your active child theme (or active theme). Tested and works.