I Want to calculate custom shipping rates based on cart amount for woocommerce, My requirement as follows,
Cart amount
- 0-10 => £4.99 (shipping_rate_id = flat_rate:12),
- 10-20 => £3.99 (shipping_rate_id = flat_rate:13),
- 20-30 => £2.99 (shipping_rate_id = flat_rate:14),
- 30-40 => £1.99 (shipping_rate_id = flat_rate:15),
- over 40 => Free Shipping (shipping_rate_id = flat_rate:17)
Note : We Do not calculate shipping charge for tobacco category. If someone buy tobacco item, Tobacco item price do not use for shipping charge calculation. To accomplish this all the tobacco items added to free shipping class (id = 150).
Setup custom query to accomplish above requirement, but it does not work as I expected
add_filter('woocommerce_package_rates', 'custom_shipping_rates_based_on_shipping_class', 11, 2);
function custom_shipping_rates_based_on_shipping_class($rates, $package) {
if (is_admin() && !defined('DOING_AJAX'))
return;
// HERE define your shipping class to find
$class = array(150);
// HERE define the shipping method to change rates for
$shipping_rate_ids = array('flat_rate:12', 'flat_rate:13', 'flat_rate:14', 'flat_rate:15');
// Initialising
$item_price = $item_qty = $item_total = 0;
// Loop through cart items
foreach($package['contents'] as $cart_item_key => $cart_item) {
$item_shipping_class_id = $cart_item['data'] - > get_shipping_class_id();
if (!in_array($item_shipping_class_id, $class)) {
$item_price += $cart_item['data'] - > get_price(); // Sum line item prices that have target shipping class
$item_qty += $cart_item['quantity']; // Sum line item prices that have target shipping class
$item_total = $item_price * $item_qty;
}
}
// Loop through shipping rates
foreach($rates as $rate_key => $rate) {
if (in_array($rate_key, $shipping_rate_ids)) {
if ($item_total > 0 && $item_total < 10) {
$rates[$rate_key] - > cost = 4.99;
unset($rates['flat_rate:13']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:15']);
unset($rates['flat_rate:17']);
}
elseif($item_total > 10.01 && $item_total < 20) {
$rates[$rate_key] - > cost = 3.99;
unset($rates['flat_rate:12']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:15']);
unset($rates['flat_rate:17']);
}
elseif($item_total > 20.01 && $item_total < 30) {
$rates[$rate_key] - > cost = 2.99;
unset($rates['flat_rate:12']);
unset($rates['flat_rate:13']);
unset($rates['flat_rate:15']);
unset($rates['flat_rate:17']);
}
elseif($item_total > 30.01 && $item_total < 40) {
$rates[$rate_key] - > cost = 1.99;
unset($rates['flat_rate:12']);
unset($rates['flat_rate:13']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:17']);
} else {
$rates[$rate_key] - > cost = 0;
unset($rates['flat_rate:12']);
unset($rates['flat_rate:13']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:15']);
}
}
}
return $rates;
}
Above code not perfect for all the scenarios, please help me.