add_filter('woocommerce_package_rates', 'hide_paid_shipping_when_free_is_available', 100, 2); function hide_paid_shipping_when_free_is_available($rates, $package) { $free_shipping = array(); foreach ($rates as $rate_id => $rate) { if ('free_shipping' === $rate->method_id) { $free_shipping[$rate_id] = $rate; } } return !empty($free_shipping) ? $free_shipping : $rates; }