Я исключаю виртуальные продукты из бесплатной доставки, с рабочим кодом ниже. Однако тарифы «Flexible_shipping_12_1» и «_12_2» являются проблематичными, поскольку они удаляются при превышении порога бесплатной доставки.
Например, пользователь покупает виртуальный продукт стоимостью 20 долларов США и другие продукты стоимостью 26 долларов США, что составляет порядка 46 долларов США, что дает им право на бесплатную доставку. Поскольку они имеют право на бесплатную доставку, остальные тарифы отменяются.
Приведенный ниже код проверяет, что фактически не виртуальная сумма составляет всего $ 26, поэтому они не должны получать бесплатную доставку. Они имеют право на ставку $ 26- $ 44,99. Эта часть работает.
Если бесплатная доставка будет удалена, они должны получить следующий уровень доставки: ID = Flexible_shipping_12_2. Этот метод удалил себя, потому что он думает, что общая сумма заказа составляет 46 $.
Мне нужно «вставить», а не создавать этот метод и # _12_1 в доступные методы доставки в местах, указанных в коде ниже.
Не могу понять, как заново вставить способ доставки:
//Exclude virtual products from free shipping
add_filter('woocommerce_package_rates', 'custom_shipping_option', 20, 2 );
function custom_shipping_option($rates, $package){
$non_virtual_total = 0;
// Get the cart content total excluding virtual products
foreach( WC()->cart->get_cart() as $cart_item )
if( ! $cart_item['data']->is_virtual( ) ){
$non_virtual_total += $cart_item['line_total'];
}
// Disabling methods based on non_virtual_total
if( $non_virtual_total < 45 && $non_virtual_total >= 25 ){
foreach ( $rates as $rate_key => $rate )
if( 'free_shipping' == $rate->method_id )
unset( $rates[ $rate_key ] );
if( 'flexible_shipping_12_1' == $rate->method_id )
unset( $rates[ $rate_key ] );
//insert flexible_shipping_12_2 method here
}
if( $non_virtual_total < 25 ){
foreach ( $rates as $rate_key => $rate )
if( 'free_shipping' == $rate->method_id )
unset( $rates[ $rate_key ] );
if( 'flexible_shipping_12_2' == $rate->method_id )
unset( $rates[ $rate_key ] );
//insert flexible_shipping_12_1 method here
}
return $rates;
}