Search code examples
phpwordpresswoocommercepayment-gatewayuser-roles

Disable WooCommerce payment gateway for guests and specific user roles


I have disabled the invoice payment mehtod for one of the user roles in my site ('customer') but now I need to add another user role ('business') to this rule and I can't figure out how to make it work. When I add the second role, the code stops working altogether and it ends up showing the gateway to all users.

Here's the code I'm using to disable the gateway:

I'm not very experienced with PHP so any help will be tremendously appreciated. If there's any chance you can correct my code to fit the use case, I would be very grateful.

add_filter( 'woocommerce_available_payment_gateways', 'payment_gateway_disable_private' );

 function payment_gateway_disable_private( $available_gateways ) {

    $user = wp_get_current_user();

    if ( isset( $available_gateways['igfw_invoice_gateway'] ) && !is_user_logged_in() || isset( $available_gateways['igfw_invoice_gateway'] ) && in_array('customer', $user->roles)  ) {
        unset( $available_gateways['igfw_invoice_gateway'] );
    }

   return $available_gateways;

}

Thoughts?


Solution

  • There is a mistake in your if statement (also you can use current_user_can() function for user roles) like:

    add_filter( 'woocommerce_available_payment_gateways', 'payment_gateway_disable_private' );
    function payment_gateway_disable_private( $available_gateways ) {
        if ( ( ! is_user_logged_in() || current_user_can('customer') || current_user_can('business') ) 
        && isset( $available_gateways['igfw_invoice_gateway'] ) ) {
            unset( $available_gateways['igfw_invoice_gateway'] );
        }
       return $available_gateways;
    }
    

    or with the global $current_user; and array_intersect() function:

    add_filter( 'woocommerce_available_payment_gateways', 'payment_gateway_disable_private' );
    function payment_gateway_disable_private( $available_gateways ) {
        global $current_user;
    
        // Here define your user roles
        $user_roles = array( 'customer', 'business' );
    
        if ( ( ! is_user_logged_in() || array_intersect( $current_user->roles, $user_roles ) ) 
        && isset( $available_gateways['igfw_invoice_gateway'] ) ) {
            unset( $available_gateways['igfw_invoice_gateway'] );
        }
       return $available_gateways;
    }
    

    It should better work now.