Это, вероятно, не лучший способ сделать это, но он работает.Поскольку я не мог получить стоимость класса доставки более умным способом, я использовал поле описания класса доставки в качестве значения.Поэтому, если стоимость для класса «средний» равна 80, мое описание также равно 80.
Предполагая, что вы используете только один метод доставки «фиксированная ставка», этот код работает.
add_filter('woocommerce_package_rates', 'shipping_costs_discounted_based_on_shipping_class', 10, 2);
function shipping_costs_discounted_based_on_shipping_class( $rates, $package ){
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return $rates;
$shipping = new \WC_Shipping();
$shipping_classes = $shipping->get_shipping_classes();
$all_shipping_costs = array();
foreach( $package['contents'] as $cart_item ) {
foreach($shipping_classes as $shipping_class) {
if( $cart_item['data']->get_shipping_class() == $shipping_class->slug )
array_push($all_shipping_costs, $shipping_class->description);
}
}
$max_value=max($all_shipping_costs);
$new_rate=$max_value + (array_sum($all_shipping_costs)-$max_value)*0.50;
foreach ( $rates as $rate_key => $rate ){
if( 'flat_rate' === $rate->method_id ){
$rates[$rate_key]->cost = $new_rate;
}
}
return $rates;
}
Еще раз, это рабочее решение, но не лучшее.
ПРИМЕЧАНИЕ. Поля описания класса доставки в серверной части должны иметь точно такое же значение, что и поле стоимости доставки!