Стоимость доставки на основе общего веса корзины в Woocommerce 3

В моем интернет-магазине Woocommerce у меня есть разные продукты. Я бы хотел, чтобы стоимость доставки рассчитывалась исходя из общего веса товаров в корзине:

  • от 0 в 6 Килограмм стоимость 5 €,
  • от 6 в 12 Килограмм стоимость 9 €

На самом деле, если у меня есть продукт, который составляет 1 килограмм, стоимость доставки 5 €, но если у меня есть 10 элементы этого продукта в моей корзине, стоимость доставки по-прежнему 5 € (так и должно быть 9 € вместо).

Как получить прогрессивную стоимость доставки в зависимости от общего веса корзины?

1

Решение

Попробуйте следующую функцию, стоимость которой будет изменена в зависимости от общего веса корзины.

Используя метод доставки «Flate rate», вам нужно будет установить справочную стоимость доставки с простой первоначальной стоимостью вместо любой формулы. Это может быть например 1, Эта стоимость будет заменена моим кодом ответа, динамически основанным на общем весе корзины.

Возможно, вам придетсяВключить режим отладки«в общих настройках доставки»Варианты доставкивкладка, временно отключить доставку кешей.

add_filter('woocommerce_package_rates', 'shipping_cost_based_on_weight', 12, 2);
function shipping_cost_based_on_weight( $rates, $package ){
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return $rates;

// HERE define the differents costs
$cost1 = 5; // Up to 6 Kg
$cost2 = 9; // Above 6 Kg and below 12 kg
$cost3 = 9; // Above 12 kg

// The cart total Weight
$total_weight = WC()->cart->get_cart_contents_weight();

// Loop through the shipping taxes array
foreach ( $rates as $rate_key => $rate ){
$has_taxes = false;
// Targetting "flat rate"if( 'flat_rate' === $rate->method_id ){
// Get the initial cost
$initial_cost = $new_cost = $rates[$rate_key]->cost;

// Calculate new cost
if( $total_weight <= 6 ) { // Below 6 Kg
$new_cost = $cost1;
}
elseif( $total_weight > 6 && $total_weight <= 12 ) { // Between 6 and 12 Kg
$new_cost = $cost2;
}
else { // Above 12 Kg
$new_cost = $cost3;
}

// Set the new cost
$rates[$rate_key]->cost = $new_cost;

// Taxes rate cost (if enabled)
$taxes = [];
// Loop through the shipping taxes array (as they can be many)
foreach ($rates[$rate_key]->taxes as $key => $tax){
if( $rates[$rate_key]->taxes[$key] > 0 ){
// Get the initial tax cost
$initial_tax_cost = $new_tax_cost = $rates[$rate_key]->taxes[$key];
// Get the tax rate conversion
$tax_rate    = $initial_tax_cost / $initial_cost;
// Set the new tax cost
$taxes[$key] = $new_cost * $tax_rate;
$has_taxes   = true; // Enabling tax
}
}
if( $has_taxes )
$rates[$rate_key]->taxes = $taxes;
}
}
return $rates;
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Проверено и работает.

После тестирования не забудьте отключить опцию «Включить режим отладки» в настройках доставки.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]