I have created a some custom shipping and discount rules for my custom user- ‘dealer’. The problem is I want to apply my conditional discount before Shipping fee is applied. For some reason it displays after.
I am unsure why this occurs. How can I update my function to display the discount before my shipping fee is added.
I have added my whole rule for context.
<code> // Here we Apply our discounnnts for dealers before shipping fees are calculated
add_action('woocommerce_cart_calculate_fees', 'apply_dealer_discounts', 10, 1);
// APly custom shipping rules for dealers after discounts
add_filter('woocommerce_package_rates', 'custom_shipping_rules_dealer', 20, 2);
function apply_dealer_discounts($cart) {
// Get the current user
$current_user = wp_get_current_user();
// Check if the user role is 'dealer'
if (in_array('dealer', (array) $current_user->roles)) {
$cart_total = $cart->cart_contents_total;
$core_or_seasonal = false;
$keg_count = 0;
// Iterate through the cart items
foreach ($cart->get_cart() as $cart_item) {
$product = wc_get_product($cart_item['product_id']);
// Check for Core or Seasonal categories
if (has_term(['core', 'seasonal'], 'product_cat', $cart_item['product_id'])) {
$core_or_seasonal = true;
}
// Check for Keg category
if (has_term('keg', 'product_cat', $cart_item['product_id'])) {
$keg_count += $cart_item['quantity'];
}
}
// Apply my discounts- This should apply before shipping.
if ($core_or_seasonal) {
$discount = $cart_total * 0.10;
$cart->add_fee(__('Core or Seasonal Discount', 'woocommerce'), -$discount);
}
if ($keg_count > 0) {
$discount = $cart_total * 0.05;
$cart->add_fee(__('Keg Discount', 'woocommerce'), -$discount);
}
}
}
function custom_shipping_rules_dealer($rates, $package) {
// Get the current user
$current_user = wp_get_current_user();
// Check if the user role is 'dealer'
if (in_array('dealer', (array) $current_user->roles)) {
// Initialize variables
$total_items = 0;
$core_or_seasonal = false;
$keg_count = 0;
// Iterate through the cart items
foreach ($package['contents'] as $item) {
$product = wc_get_product($item['product_id']);
$categories = $product->get_category_ids();
// Check for Core or Seasonal categories
if (has_term(['core', 'seasonal'], 'product_cat', $item['product_id'])) {
$core_or_seasonal = true;
$total_items += $item['quantity'];
}
// Check for Keg category
if (has_term('keg', 'product_cat', $item['product_id'])) {
$keg_count += $item['quantity'];
}
}
// Get the shipping zone
$zone_id = WC_Shipping_Zones::get_zone_matching_package($package);
$zone = new WC_Shipping_Zone($zone_id);
$zone_name = $zone->get_zone_name();
// Debug statements
error_log('Zone Name: ' . $zone_name);
error_log('Keg Count: ' . $keg_count);
error_log('Core or Seasonal: ' . ($core_or_seasonal ? 'Yes' : 'No'));
error_log('Total Items: ' . $total_items);
// Calculate shipping cost based on conditions
foreach ($rates as $rate_key => $rate) {
// Apply rules for Core or Seasonal categories
if ($core_or_seasonal) {
if ($total_items >= 10) {
$rates[$rate_key]->cost = 0;
} else {
$rates[$rate_key]->cost = 60 * $total_items;
}
}
// Apply rules for Keg category
if ($keg_count > 0) {
if ($zone_name === 'Bangkok Metropolitan Region') {
$rates[$rate_key]->cost = 0;
} else {
$rates[$rate_key]->cost = 300 * $keg_count;
}
}
}
}
return $rates;
}
</code>
<code> // Here we Apply our discounnnts for dealers before shipping fees are calculated
add_action('woocommerce_cart_calculate_fees', 'apply_dealer_discounts', 10, 1);
// APly custom shipping rules for dealers after discounts
add_filter('woocommerce_package_rates', 'custom_shipping_rules_dealer', 20, 2);
function apply_dealer_discounts($cart) {
// Get the current user
$current_user = wp_get_current_user();
// Check if the user role is 'dealer'
if (in_array('dealer', (array) $current_user->roles)) {
$cart_total = $cart->cart_contents_total;
$core_or_seasonal = false;
$keg_count = 0;
// Iterate through the cart items
foreach ($cart->get_cart() as $cart_item) {
$product = wc_get_product($cart_item['product_id']);
// Check for Core or Seasonal categories
if (has_term(['core', 'seasonal'], 'product_cat', $cart_item['product_id'])) {
$core_or_seasonal = true;
}
// Check for Keg category
if (has_term('keg', 'product_cat', $cart_item['product_id'])) {
$keg_count += $cart_item['quantity'];
}
}
// Apply my discounts- This should apply before shipping.
if ($core_or_seasonal) {
$discount = $cart_total * 0.10;
$cart->add_fee(__('Core or Seasonal Discount', 'woocommerce'), -$discount);
}
if ($keg_count > 0) {
$discount = $cart_total * 0.05;
$cart->add_fee(__('Keg Discount', 'woocommerce'), -$discount);
}
}
}
function custom_shipping_rules_dealer($rates, $package) {
// Get the current user
$current_user = wp_get_current_user();
// Check if the user role is 'dealer'
if (in_array('dealer', (array) $current_user->roles)) {
// Initialize variables
$total_items = 0;
$core_or_seasonal = false;
$keg_count = 0;
// Iterate through the cart items
foreach ($package['contents'] as $item) {
$product = wc_get_product($item['product_id']);
$categories = $product->get_category_ids();
// Check for Core or Seasonal categories
if (has_term(['core', 'seasonal'], 'product_cat', $item['product_id'])) {
$core_or_seasonal = true;
$total_items += $item['quantity'];
}
// Check for Keg category
if (has_term('keg', 'product_cat', $item['product_id'])) {
$keg_count += $item['quantity'];
}
}
// Get the shipping zone
$zone_id = WC_Shipping_Zones::get_zone_matching_package($package);
$zone = new WC_Shipping_Zone($zone_id);
$zone_name = $zone->get_zone_name();
// Debug statements
error_log('Zone Name: ' . $zone_name);
error_log('Keg Count: ' . $keg_count);
error_log('Core or Seasonal: ' . ($core_or_seasonal ? 'Yes' : 'No'));
error_log('Total Items: ' . $total_items);
// Calculate shipping cost based on conditions
foreach ($rates as $rate_key => $rate) {
// Apply rules for Core or Seasonal categories
if ($core_or_seasonal) {
if ($total_items >= 10) {
$rates[$rate_key]->cost = 0;
} else {
$rates[$rate_key]->cost = 60 * $total_items;
}
}
// Apply rules for Keg category
if ($keg_count > 0) {
if ($zone_name === 'Bangkok Metropolitan Region') {
$rates[$rate_key]->cost = 0;
} else {
$rates[$rate_key]->cost = 300 * $keg_count;
}
}
}
}
return $rates;
}
</code>
// Here we Apply our discounnnts for dealers before shipping fees are calculated
add_action('woocommerce_cart_calculate_fees', 'apply_dealer_discounts', 10, 1);
// APly custom shipping rules for dealers after discounts
add_filter('woocommerce_package_rates', 'custom_shipping_rules_dealer', 20, 2);
function apply_dealer_discounts($cart) {
// Get the current user
$current_user = wp_get_current_user();
// Check if the user role is 'dealer'
if (in_array('dealer', (array) $current_user->roles)) {
$cart_total = $cart->cart_contents_total;
$core_or_seasonal = false;
$keg_count = 0;
// Iterate through the cart items
foreach ($cart->get_cart() as $cart_item) {
$product = wc_get_product($cart_item['product_id']);
// Check for Core or Seasonal categories
if (has_term(['core', 'seasonal'], 'product_cat', $cart_item['product_id'])) {
$core_or_seasonal = true;
}
// Check for Keg category
if (has_term('keg', 'product_cat', $cart_item['product_id'])) {
$keg_count += $cart_item['quantity'];
}
}
// Apply my discounts- This should apply before shipping.
if ($core_or_seasonal) {
$discount = $cart_total * 0.10;
$cart->add_fee(__('Core or Seasonal Discount', 'woocommerce'), -$discount);
}
if ($keg_count > 0) {
$discount = $cart_total * 0.05;
$cart->add_fee(__('Keg Discount', 'woocommerce'), -$discount);
}
}
}
function custom_shipping_rules_dealer($rates, $package) {
// Get the current user
$current_user = wp_get_current_user();
// Check if the user role is 'dealer'
if (in_array('dealer', (array) $current_user->roles)) {
// Initialize variables
$total_items = 0;
$core_or_seasonal = false;
$keg_count = 0;
// Iterate through the cart items
foreach ($package['contents'] as $item) {
$product = wc_get_product($item['product_id']);
$categories = $product->get_category_ids();
// Check for Core or Seasonal categories
if (has_term(['core', 'seasonal'], 'product_cat', $item['product_id'])) {
$core_or_seasonal = true;
$total_items += $item['quantity'];
}
// Check for Keg category
if (has_term('keg', 'product_cat', $item['product_id'])) {
$keg_count += $item['quantity'];
}
}
// Get the shipping zone
$zone_id = WC_Shipping_Zones::get_zone_matching_package($package);
$zone = new WC_Shipping_Zone($zone_id);
$zone_name = $zone->get_zone_name();
// Debug statements
error_log('Zone Name: ' . $zone_name);
error_log('Keg Count: ' . $keg_count);
error_log('Core or Seasonal: ' . ($core_or_seasonal ? 'Yes' : 'No'));
error_log('Total Items: ' . $total_items);
// Calculate shipping cost based on conditions
foreach ($rates as $rate_key => $rate) {
// Apply rules for Core or Seasonal categories
if ($core_or_seasonal) {
if ($total_items >= 10) {
$rates[$rate_key]->cost = 0;
} else {
$rates[$rate_key]->cost = 60 * $total_items;
}
}
// Apply rules for Keg category
if ($keg_count > 0) {
if ($zone_name === 'Bangkok Metropolitan Region') {
$rates[$rate_key]->cost = 0;
} else {
$rates[$rate_key]->cost = 300 * $keg_count;
}
}
}
}
return $rates;
}