'Minimum order amount except for specific shipping method in WooCommerce

In WooCommerce, I use the following code to set a minimum order amount:

add_action( 'woocommerce_checkout_process', 'wc_minimum_order_amount' );
add_action( 'woocommerce_before_cart' , 'wc_minimum_order_amount' );

function wc_minimum_order_amount() {

    $minimum = 50; // Hier gibst du den Mindestbestellwert ein
    
    if ( WC()->cart->total < $minimum ) { 
        if( is_cart() ) { 
            wc_print_notice( sprintf( 'Der Mindestbestellwert beträgt %s pro Bestellung. Der aktuelle Bestellwert beträgt %s.' , // Text fuer Warenkorb 
                wc_price( $minimum ), 
                wc_price( WC()->cart->total )
            ), 'error' );
        } else {
            wc_add_notice( sprintf( 'Der Mindestbestellwert beträgt %s pro Bestellung. Der aktuelle Bestellwert beträgt %s.' , // Text fuer Kasse
                wc_price( $minimum ),
                wc_price( WC()->cart->total )
            ), 'error' );
        }
    }
}

Now if the customer chooses "self pickup" ("Local pickup shipping method), I don't want any minimum required order amount.

How can I set Minimum order amount except for "Local pickup" shipping method in WooCommerce?



Solution 1:[1]

Based on Getting minimum order amount for 'Free Shipping' method in checkout page answer code and also Set a minimum order amount in WooCommerce answer code, here is the correct way to set a Minimum order amount except for specific shipping method in WooCommerce:

add_action( 'woocommerce_check_cart_items', 'wc_minimum_required_order_amount' );
function wc_minimum_required_order_amount() {

    // HERE Your settings
    $minimum_amount     = 50; // The minimum cart total amount
    $shipping_method_id = 'local_pickup'; // The targeted shipping method Id (exception)

    // Get some variables
    $cart_total     = (float) WC()->cart->total; // Total cart amount
    $chosen_methods = (array) WC()->session->get( 'chosen_shipping_methods' ); // Chosen shipping method rate Ids (array)

    // Only when a shipping method has been chosen
    if ( ! empty($chosen_methods) ) {
        $chosen_method  = explode(':', reset($chosen_methods)); // Get the chosen shipping method Id (array)
        $chosen_method_id = reset($chosen_method); // Get the chosen shipping method Id
    }

    // If "Local pickup" shipping method is chosen, exit (no minimun is required)
    if ( isset($chosen_method_id) && $chosen_method_id === $shipping_method_id ) {
        return; // exit
    }

    // Add an error notice is cart total is less than the minimum required
    if ( $cart_total < $minimum_amount ) {
        wc_add_notice( sprintf(
            __("The minimum required order amount is %s (your current order amount is %s).", "woocommerce"), // Text message
            wc_price( $minimum_amount ),
            wc_price( $cart_total )
        ), 'error' );
    }
}

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

or also you can use:

add_action( 'woocommerce_checkout_process', 'wc_minimum_required_order_amount' );
add_action( 'woocommerce_before_cart' , 'wc_minimum_required_order_amount' );
function wc_minimum_required_order_amount() {

    // HERE Your settings
    $minimum_amount     = 100; // The minimum cart total amount
    $shipping_method_id = 'local_pickup'; // The targeted shipping method Id (exception)

    // Get some variables
    $cart_total     = (float) WC()->cart->total; // Total cart amount
    $chosen_methods = (array) WC()->session->get( 'chosen_shipping_methods' ); // Chosen shipping method rate Ids (array)

    // Only when a shipping method has been chosen
    if ( ! empty($chosen_methods) ) {
        $chosen_method  = explode(':', reset($chosen_methods)); // Get the chosen shipping method Id (array)
        $chosen_method_id = reset($chosen_method); // Get the chosen shipping method Id
    }

    // If "Local pickup" shipping method is chosen, exit (no minimun is required)
    if ( isset($chosen_method_id) && $chosen_method_id === $shipping_method_id ) {
        return; // exit
    }

    // Add an error notice is cart total is less than the minimum required
    if ( $cart_total < $minimum_amount ) {
        $text_notice = sprintf(
            __("The minimum required order amount is %s (your current order amount is %s).", "woocommerce"), // Text message
            wc_price( $minimum_amount ),
            wc_price( $cart_total )
        );
        
        if ( is_cart() ) {
            wc_print_notice( $text_notice, 'error' );
        } else {
            wc_add_notice( $text_notice, 'error' );
        }
    }
}

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

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 LoicTheAztec