<?php

/**
 * Copy from here to your (child) themes functions.php
 * Recommended to do so via FTP.
 */

/**
 * Hide all but the free shipping options when free is available.
 *
 * Shows ALL free options when available.
 * Does NOT take in account local pickup as free shipping - It does show local pickup rates in the list of free shipping rates
 * DOES consider non-'free_shipping' rates that have 0 cost as free shipping.
 */
function custom_hide_all_shipping_when_free_is_available( $shipping_rates) {

	$free_rates = array();
	$free_shipping_available = false;

	foreach ( $shipping_rates as $key => $rate ) {

		// Check for free rates / don't take in account local pickup
		if ( 0 == $rate->cost && $rate->method_id != 'local_pickup' ) {
			$free_shipping_available = true;
		}

		if ( 0 == $rate->cost ) {
			$free_rates[ $key ] = $rate;
		}

	}

	// Show all free rates
	if ( $free_shipping_available ) {
		return $free_rates;
	}

	return $shipping_rates;

}
add_filter( 'woocommerce_package_rates', 'custom_hide_all_shipping_when_free_is_available' );