Используйте разные цены доставки в зависимости от промежуточной суммы корзины в Woocommerce

Как я могу использовать разные цены доставки в зависимости от промежуточной суммы корзины в Woocommerce?

Например:

  • Если промежуточный итог меньше 5000, то стоимость фиксированной ставки составляет 250.
  • Если промежуточный итог меньше 2000, стоимость фиксированной ставки составляет 150.
  • Если промежуточный итог составляет более 5000, то стоимость доставки отсутствует.

И если возможно, я хочу, чтобы зарядить конкретный продукт за 500.

-1

Решение

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

Если промежуточный итог корзины составляет до 5000, мы будем скрывать «Единый тариф». Вам нужно будет включить бесплатный способ доставки с опцией «Минимальная сумма заказа» 5000.

введите описание изображения здесь

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

введите описание изображения здесь

Это будет также обрабатывать конкретный идентификатор продукта и установит стоимость 500, если есть в корзине.

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

Код:

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

// HERE define the differents costs
$cost1 = 150; // Below 2000
$cost2 = 250; // Below 5000
$cost3 = 500; // Cost for our specific product ID

$step1_subtotal = 2000;
$max_subtotal   = 5000;


// HERE DEFINE the specific product ID to be charged at 500
$targeted_product_id = 37;

// The cart subtotal
$subtotal = WC()->cart->get_subtotal();

// Loop through cart items and checking for the specific product
$found = false;
foreach( $package['contents'] as $item ) {
if( $item['product_id'] == $targeted_product_id || $item['variation_id'] == $targeted_product_id ){
$found = true;
break;
}
}

// Loop through the shipping taxes array
foreach ( $rates as $rate_key => $rate ){
$has_taxes = false;

// If subtotal is up to 5000 we enable free shipping only
if( 'free_shipping' !== $rate->method_id && $subtotal >= $max_subtotal ){
unset($rates[$rate_key]);
}
// Targetting "flat rate" only for subtotal below 5000
else if( 'flat_rate' === $rate->method_id && $subtotal < $max_subtotal ){
// Get the initial cost
$initial_cost = $new_cost = $rates[$rate_key]->cost;

// Calculate new cost
if( $subtotal < $step1_subtotal ) { // Below 2000
$new_cost = $cost1;
}
elseif( $subtotal >= $step1_subtotal && $subtotal < $max_subtotal ) { // Between 2000 and below 5000
$new_cost = $cost2;
}

// For the specific product ID (if found in cart items)
if( $found ){
$new_cost = $cost2;
}

// 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 вашей активной дочерней темы (или активной темы). Проверено и работает.

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

1

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

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

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