Home > Net >  Disable gateways for WooCommerce products
Disable gateways for WooCommerce products

Time:10-04

I currently have code installed on my website. Its function is to disable "Stripe" as a gateway for an array of products (2422, 2423,2424, 2425). I would like to customize the code for product_id 3197 to disable bank transfer (backs) and COD (cash on delivery) gateways.

    add_filter( 'woocommerce_available_payment_gateways', 'rudr_payment_methods_by_product_ids' );
    
    function rudr_payment_methods_by_product_ids( $gateways ){
    
        // do nothing in /wp-admin
        if( is_admin() ) {
            return $gateways;
        }
        
        // Add product IDs you would like to unset payment gateways for
        $product_ids = array( 
            2422,
            2423,
            2424,
            2425
        );
        
        // do nothing on "Pay for order" page
        if( is_wc_endpoint_url( 'order-pay' ) ) {
            return $gateways;   
        }
    
        foreach ( WC()->cart->get_cart_contents() as $key => $cart_item ) {
            // count number of items if needed (optional) 
            if( in_array( $cart_item[ 'data' ]->get_id(), $product_ids ) ) {
                if( isset( $gateways[ 'stripe' ] ) ) {
                    unset( $gateways[ 'stripe' ] );
                    break; // exit the loop if the specific product is found
                }
            }
        }
    
        return $gateways; 
        

}

CodePudding user response:

add_filter('woocommerce_available_payment_gateways', 'rudr_payment_methods_by_product_ids');

function rudr_payment_methods_by_product_ids($gateways) {

    // do nothing in /wp-admin
    if (is_admin()) {
        return $gateways;
    }

    // Add product IDs you would like to unset payment gateways for
    $product_ids = array(
        2422,
        2423,
        2424,
        2425
    );

    $cod_product_ids = array(3197);
    // do nothing on "Pay for order" page
    if (is_wc_endpoint_url('order-pay')) {
        return $gateways;
    }

    foreach (WC()->cart->get_cart_contents() as $key => $cart_item) {
        // count number of items if needed (optional) 
        if (in_array($cart_item['data']->get_id(), $product_ids)) {
            if (isset($gateways['stripe'])) {
                unset($gateways['stripe']);
                break; // exit the loop if the specific product is found
            }
        }
        if (in_array($cart_item['data']->get_id(), $cod_product_ids)) {
            if (isset($gateways['cod'])) {
                unset($gateways['cod']);
            }
            if (isset($gateways['bacs'])) {
                unset($gateways['bacs']);
            }
        }
    }

    return $gateways;
}
  • Related