Skip to content
Advertisement

Remove WooCommerce Payment Gateways for defined groups of product categories

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.

User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement