wordpresswoocommercepayment-gatewayuser-roles

Cash on delivery (COD) based on user role and product category


I need to customize cash on delivery (COD) in WooCommerce based on user role and product category.

Requirements:

This is my code attempt to meet the above requirements:

function disable_cod($available_gateways)
{

    if (is_admin()) return $available_gateways;

    $role = false;
     //check whether the avaiable payment gateways have Cash on delivery and user is not logged in or he is a user with role customer
    if (isset($available_gateways['cod']) && (current_user_can('customer') || !is_user_logged_in()))
    {
        $role = true;
    }

    foreach (WC()
        ->cart
        ->get_cart() as $cart_item_key => $cart_item)
    {
        $prod_simple = true;
        // Get the WC_Product object
        $product = wc_get_product($cart_item['product_id']);
        // Get the product types in cart (example)
        if ($product->is_product_category('X')) $prod_simple = false;

    }

    if ($prod_simple = $role = true) unset($available_gateways['cod']); // unset 'cod'
    

    return $available_gateways;
}

add_filter('woocommerce_available_payment_gateways', 'disable_cod', 99, 1);

I definitely got something wrong in the syntax, but I hope the logical concept is correct? Any advice?


Solution

  • Your code contains some minor mistakes:

    So you get:

    function filter_woocommerce_available_payment_gateways( $payment_gateways ) {
        // Not on admin
        if ( is_admin() ) return $payment_gateways;
    
        // Initialize: flag - default true
        $flag = true;
    
        // Has certain user role
        if ( current_user_can( 'certain-user-role' ) ) {
            // False
            $flag = false;
        } else {
            // Specific categories: the term name/term_id/slug. Several could be added, separated by a comma
            $categories = array( 63, 15, 'categorie-1' );
    
            // Isset
            if ( WC()->cart ) {
                // Loop through cart items
                foreach ( WC()->cart->get_cart() as $cart_item ) {
                    // Has term (product category)
                    if ( has_term( $categories, 'product_cat', $cart_item['product_id'] ) ) {
                        // False, break loop
                        $flag = false;
                        break;
                    }
                }
            }
        }
    
        // True
        if ( $flag ) {
            // Cod
            if ( isset( $payment_gateways['cod'] ) ) {
                // Remove
                unset( $payment_gateways['cod'] );
            }  
        }
        
        return $payment_gateways;
    }
    add_filter( 'woocommerce_available_payment_gateways', 'filter_woocommerce_available_payment_gateways', 10, 1 );