Search code examples
phpwordpresswoocommercepayment-gatewaycart

Disable payment gateway when specific products in WooCommerce cart


I want to unset the payment method 'bacs' for the product ID 6197.

I have tried the code below, but this does not have the desired result.

add_filter( 'woocommerce_available_payment_gateways', 'wp_unset_gateway_by_id', 10, 2 );` 
function wp_unset_gateway_by_id( $available_gateways, $products) {
    global $woocommerce;
    $unset = false;
    $product_ids = array('6197');

    if( in_array( $product->get_id(), $product_ids ) || ( $product->is_type('variation') && in_array( $product->get_parent_id(), $product_ids ) ) ){
        unset( $available_gateways['bacs'] ); 
        return $available_gateways;
    }
}

I believe I am doing something wrong, but I am relatively new to this. Any advice would be appreciated.


Solution

  • $products is not passed as argument to the woocommerce_available_payment_gateways filter hook

    Apply it in the following way:

    function filter_woocommerce_available_payment_gateways( $payment_gateways ) {
        // Not on admin
        if ( is_admin() ) return $payment_gateways;
        
        // The targeted product ids (several can be added, separated by a comma)
        $targeted_ids = array( 6197 );
    
        // Flag
        $found = false;
    
        // WC Cart
        if ( WC()->cart ) {
            // Loop through cart items
            foreach ( WC()->cart->get_cart() as $cart_item ) {
                if ( array_intersect( $targeted_ids, array( $cart_item['product_id'], $cart_item['variation_id'] ) ) ) {
                    $found = true;
                    break;
                }
            }
        }
        
        // True
        if ( $found ) {       
            // Bacs
            if ( isset( $payment_gateways['bacs'] ) ) {
                unset( $payment_gateways['bacs'] );
            }       
        }
        
        return $payment_gateways;
    }
    add_filter( 'woocommerce_available_payment_gateways', 'filter_woocommerce_available_payment_gateways', 10, 1 );