WooCommerce Minimum Order Amount

<?php
/**
 * Simple WooCommerce Minimum Order Amount
 */

$minimum_order_amount = 99;
$minimum_order_message = 'Minimum order amount is $99. Please add more items to your cart.';


if ( ! function_exists( 'is_woocommerce_active' ) || ! is_woocommerce_active() ) {
    return;
}


function cart_meets_minimum() {
    global $minimum_order_amount;
    if ( ! WC()->cart ) return true;
    return WC()->cart->get_subtotal() >= $minimum_order_amount;
}


add_action( 'woocommerce_check_cart_items', function() {
    global $minimum_order_message;
    if ( ! cart_meets_minimum() ) {
        wc_add_notice( $minimum_order_message, 'error' );
    }
});


add_filter( 'woocommerce_order_button_html', function( $button ) {
    global $minimum_order_message;
    if ( ! cart_meets_minimum() ) {
        return '<button type="button" class="button alt" disabled style="opacity:0.5;cursor:not-allowed;" title="' . esc_attr($minimum_order_message) . '">' . 
               esc_html__( 'Place order', 'woocommerce' ) . '</button>';
    }
    return $button;
});


add_action( 'template_redirect', function() {
    global $minimum_order_message;
    if ( is_checkout() && ! is_wc_endpoint_url() && WC()->cart && ! WC()->cart->is_empty() && ! cart_meets_minimum() ) {
        wc_add_notice( $minimum_order_message, 'error' );
        wp_safe_redirect( wc_get_cart_url() );
        exit;
    }
});


add_action( 'wp_footer', function() {
    if ( ! is_cart() && ! is_checkout() ) return;
    ?>
    <style>
    .minimum-order-notice {
        background: #ffebe8;
        border: 1px solid #e2401c;
        color: #e2401c;
        padding: 15px;
        margin: 15px 0;
        border-radius: 4px;
    }
    </style>
    <script>
    jQuery(function($) {
        function checkMinimum() {
            $.post('<?php echo admin_url('admin-ajax.php'); ?>', {
                action: 'check_cart_minimum',
                nonce: '<?php echo wp_create_nonce('cart_minimum'); ?>'
            }, function(response) {
                if (response.success) {
                    // Remove existing notices
                    $('.minimum-order-notice').remove();
                    
                    if (!response.data.meets_minimum) {
                        // Add notice to cart
                        $('.cart-collaterals').prepend('<div class="minimum-order-notice"><?php echo esc_js($minimum_order_message); ?></div>');
                        
                        // Disable checkout buttons
                        $('.checkout-button, .wc-proceed-to-checkout .button').prop('disabled', true).css('opacity', '0.5');
                    } else {
                        // Enable checkout buttons
                        $('.checkout-button, .wc-proceed-to-checkout .button').prop('disabled', false).css('opacity', '1');
                    }
                }
            });
        }
        
        // Check on page load and cart updates
        checkMinimum();
        $(document.body).on('updated_cart_totals updated_checkout', checkMinimum);
        $(document).on('change', '.qty', function() { setTimeout(checkMinimum, 500); });
    });
    </script>
    <?php
});


add_action( 'wp_ajax_check_cart_minimum', 'ajax_check_cart_minimum' );
add_action( 'wp_ajax_nopriv_check_cart_minimum', 'ajax_check_cart_minimum' );

function ajax_check_cart_minimum() {
    global $minimum_order_amount;
    check_ajax_referer( 'cart_minimum', 'nonce' );
    
    wp_send_json_success( array(
        'meets_minimum' => cart_meets_minimum(),
        'cart_total' => WC()->cart ? WC()->cart->get_subtotal() : 0,
        'minimum_required' => $minimum_order_amount
    ));
}


function is_woocommerce_active() {
    return in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) );
}

?>