Я нашел решение для подсчета фиксированной ставки на основе определенных шагов количества в woocommerce, и мне нужно дополнительно добавить дополнительную конкретную сумму в зависимости от зоны доставки. Например: я взимал с клиента 4 доллара за каждые 3 товара в зависимости от конкретного класса доставки, поэтому, если клиент добавил в корзину 6 товаров с одним и тем же классом доставки, он будет взимать 8 долларов, что мне нужно, чтобы добавить дополнительно 50 долларов в зависимости от класса доставки. зона доставки клиента, поэтому общая стоимость доставки составит 58 долларов (8 за номер товара + 50 за зону доставки), также я хочу иметь возможность добавлять в код множество классов доставки и множество зон доставки.
Вот код:
add_filter( 'woocommerce_package_rates', 'progressive_shipping_cost_based_shipping_class_quantity_steps', 10, 2 );
function progressive_shipping_cost_based_shipping_class_quantity_steps( $rates, $package )
{
// HERE Bellow your settings
$shipping_class = "very-light-weight"; // The shipping class ID
$qty_step = 20; // Items qty threshold for a step
$item_count = 0; // Initializing
// Get the shipping class ID
$class_id = get_term_by('slug', $shipping_class, 'product_shipping_class' )->term_id;
// Loop through in cart items to get the Tshirts count
foreach( $package['contents'] as $cart_item ) {
if ( $cart_item['data']->get_shipping_class_id() == $class_id ){
$item_count += $cart_item['quantity']; // Count Tshirts
}
}
// The rate operand increase each {$qty_step} depending on {$item_count}
$rate_operand = ceil( $item_count / $qty_step );
foreach ( $rates as $rate_key => $rate ){
// Targetting "Flat rate"
if ( 'flat_rate' === $rate->method_id ) {
$has_taxes = false;
// Set the new cost
$rates[$rate_key]->cost = $rate->cost * $rate_operand;
// Taxes rate cost (if enabled)
foreach ($rates[$rate_key]->taxes as $key => $tax){
if ( $tax > 0 ){
// New tax calculated cost
$taxes[$key] = $tax * $rate_operand;
$has_taxes = true;
}
}
// Set new taxes cost
if ( $has_taxes )
$rates[$rate_key]->taxes = $taxes;
}
}
return $rates;
}
Я попробовал следующий код, чтобы добавить дополнительные 50 долларов к стоимости доставки, но он не работает:
// Add $50 shipping cost based on shipping zone
add_filter('woocommerce_package_rates', 'add_custom_shipping_rate', 10, 2);
function add_custom_shipping_rate($rates, $package) {
$zone = WC_Shipping_Zones::get_zone_matching_package($package);
$zone_name = $zone->get_zone_name();
if ($zone_name === 'Your Shipping Zone Name') {
foreach ($rates as $rate_key => $rate) {
$rates[$rate_key]->cost += 50;
}
}
return $rates;
}






Попробуйте следующий код, чтобы увеличить стоимость доставки в зависимости от зоны доставки. Вы можете добавить столько зон доставки и увеличить стоимость в данном коде.
function add_custom_shipping_rate( $rates, $package ) {
// Shipping zone
$shipping_zone = wc_get_shipping_zone( $package );
// Get zone ID
$zone_id = $shipping_zone->get_id();
foreach( $rates as $rate_key => $rate ){
if ($zone_id == 1){
$rates[$rate_key]->cost = $rate->cost + 40;
}
else if ($zone_id == 2){
$rates[$rate_key]->cost = $rate->cost + 50;
}
else{
$rates[$rate_key]->cost = $rate->cost;
}
}
return $rates;
}
add_filter( 'woocommerce_package_rates', 'add_custom_shipping_rate', 10, 2 );
Код проверен и работает.
Большое спасибо, это работает очень хорошо, я просто хочу применить ту же условную концепцию к шагам количества, чтобы иметь возможность добавлять как можно больше классов доставки и шагов количества, например: if Shipping_class = "very-light-weight" qty_step = 20; если Shipping_class = «тяжелый» qty_step = 10;