To determine the shipping discount based on the subtotal you can use the 2nd argument passed to the filter hook, namely: $package
. Then you use: $package['cart_subtotal']
So you get:
function filter_woocommerce_package_rates( $rates, $package ) {
// Get subtotal
$subtotal = $package['cart_subtotal'];
// Greater than
if ( $subtotal > 350 ) {
// 50% discount
$percentage = 50;
// If more, adjust percentage
if ( $subtotal > 450 ) {
// 70% discount
$percentage = 70;
}
// Loop trough
foreach ( $rates as $rate_id => $rate ) {
// Get rate cost
$cost = $rate->get_cost();
// New rate cost
$rate->set_cost( $cost - ( $cost * $percentage ) / 100 );
}
}
return $rates;
}
add_filter( 'woocommerce_package_rates', 'filter_woocommerce_package_rates', 10, 2 );
To target certain shipping methods, change:
// Loop trough
foreach ( $rates as $rate_id => $rate ) {
// Get rate cost
$cost = $rate->get_cost();
// New rate cost
$rate->set_cost( $cost - ( $cost * $percentage ) / 100 );
}
To:
// Loop trough
foreach ( $rates as $rate_id => $rate ) {
// Get rate cost
$cost = $rate->get_cost();
// Targeting shipping method, several can be added, separated by a comma
if ( array_intersect( array( $rate->method_id, $rate_id ), array( 'flat_rate', 'flat_rate:3' ) ) ) {
// New rate cost
$rate->set_cost( $cost - ( $cost * $percentage ) / 100 );
}
}
Hint: for debugging purposes you can temporarily use the second part from this answer