Search code examples
phpwoocommercecartcheckoutuser-roles

Set a minimal order amount for a specific User role in Woocommerce


I'm creating a wholesale website. Looking on here I was able to already find code for switching between two user roles after customers place a first order. Now I just need to be able to set minimum order amounts for different user roles on the cart/checkout page and most of what I've been finding does way more than I need it to. Searching online I was able to find this bit of code:

<?php
/*
Author: Doug Edgington
Description: Require a minimum order total in Woocommerce for a user role
*/
function dee_minimum_order_total_required() {
    if( is_user_logged_in() ) { 
        global $woocommerce;
        global $current_user;

        get_currentuserinfo();

        $dee_user_roles = $current_user->roles;
        $dee_user_role = array_shift($dee_user_roles);

        $dee_minimum = 50;
        if ( $woocommerce->cart->subtotal < $dee_minimum  && $dee_user_role == 'wholesale_buyer') {
            $woocommerce->add_error( sprintf( 'Wholesale users must have a minimum order total of $%s to place an order.' , $dee_minimum ) );
        }
    } //end main if statement
}
add_action( 'woocommerce_checkout_process', 'dee_minimum_order_total_required' );

How would I add more than 1 user role to this code?


Solution

  • The code you are using is really old and obsolete. The code below will check cart items for Wholesale user role that should have a minimal order amount:

    // Cart and checkout validation
    add_action( 'woocommerce_check_cart_items', 'minimal_total_required' ); // Cart and Checkout
    add_action( 'woocommerce_checkout_process', 'minimal_total_required' ); // Checkout (optional)
    function minimal_total_required() {
        $user = wp_get_current_user();
    
        ## -- YOUR SETTINGS BELOW -- ##
    
        $min_amount    = 50; // Minimal order amount
        $targeted_role = 'wholesale_buyer'; // User role
    
        // Exit for non logged users or when minimal order amout is reached
        if( $user->ID == 0 || WC()->cart->subtotal >= $min_amount ) 
            return; 
    
        // Display an error notice for Wholesale user role
        if ( in_array( $targeted_role, $user->roles ) ) 
            wc_add_notice( sprintf( __("As a Wholesale user you must have a minimal order total of %s.") , wc_price($min_amount) ), 'error' );
    }
    

    Code goes in function.php file of your active child theme (or active theme). Tested and works.

    enter image description here

    enter image description here


    For Two user roles and two minimal amounts you will use the following:

    // Cart and checkout validation
    add_action( 'woocommerce_check_cart_items', 'minimal_total_required' ); // Cart and Checkout
    add_action( 'woocommerce_checkout_process', 'minimal_total_required' ); // Checkout (optional)
    function minimal_total_required() {
        $user = wp_get_current_user();
    
        // Exit for non logged users
        if( $user->ID == 0 ) return;
    
        ## -- YOUR SETTINGS BELOW (For 2 user roles and 2 minimal amounts) -- ##
    
        $min_amount    = array( 50, 40 ); // Minimal order amounts
        $targeted_role = array('wholesale_buyer', 'customer'); // Targetted User roles
    
        $cart_subtotal  = WC()->cart->subtotal;
    
        // Wholesale user
        if ( in_array( $targeted_role[0], $user->roles ) && $cart_subtotal < $min_amount[0]){
            $text = sprintf( __('As a Wholesale user you must have a minimal order total amount of %s.'), wc_price($min_amount[0]) );
        }
        // Customer user
        elseif ( in_array( $targeted_role[1], $user->roles ) && $cart_subtotal < $min_amount[1]){
            $text = sprintf( __('You must have a minimal order total amount of %s.'), wc_price($min_amount[1]) );
        }
    
        // Display an error notice for Wholesale user role
        if( isset($text) )
            wc_add_notice( $text, 'error' );
    }
    

    Code goes in function.php file of your active child theme (or active theme). Tested and works.

    It will display a different notice for each user role.