Disable Flat Rate if Free Shipping is available – Woocommerce

Table of Contents

// Disable Flat Rate if Free Shipping is available
add_filter( 'woocommerce_package_rates', 'hide_flat_rate_when_free_is_available', 100, 2 );
function hide_flat_rate_when_free_is_available( $rates, $package ) {

    // Debug: write to WooCommerce log
    wc_get_logger()->info( 'Package rates: ' . print_r( array_keys( $rates ), true ), array( 'source' => 'shipping-debug' ) );

    $free_shipping_exists = false;

    // First check if free shipping is available
    foreach ( $rates as $rate_id => $rate ) {
        if ( strpos( $rate_id, 'free_shipping' ) === 0 ) {
            $free_shipping_exists = true;
            break;
        }
    }

    // If free shipping exists, remove all flat rates
    if ( $free_shipping_exists ) {
        foreach ( $rates as $rate_id => $rate ) {
            if ( strpos( $rate_id, 'flat_rate' ) === 0 ) {
                unset( $rates[ $rate_id ] );
            }
        }
    }

    return $rates;
}

Leave a Reply