Vash
Vash

Reputation: 35

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?

Upvotes: 2

Views: 1471

Answers (1)

LoicTheAztec
LoicTheAztec

Reputation: 253901

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.

Upvotes: 3

Related Questions