Adding costs to woocommerce products at checkout

46 Views Asked by At

I have the code below, I have it setup so each product has the following fields:

  • shipping_national_free_shipping - checkbox
  • shipping_national_one_item_cost - number field
  • shipping_national_additional_items_cost - number field

If shipping_national_free_shipping is disabled, the code below works out the shipping cost and adds it to the product. That works.
However if shipping_national_free_shipping is enabled and there are still values in the other two fields it still adds the shipping cost when it should ignore those fields when shipping_national_free_shipping is enabled.

function kraftdeck_national_shipping_cost_logic($cart)
{
    if (is_admin() && !defined('DOING_AJAX')) {
        return;
    }

    error_log('Starting national shipping cost logic...');

    $customer_shipping_country_code = WC()->customer->get_shipping_country();
    $customer_shipping_country = kraftdeck_get_full_country_name($customer_shipping_country_code);

    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $product_id = $cart_item['product_id'];
        $national_free_shipping = get_field('shipping_national_free_shipping', $product_id);

        // Check if national free shipping is enabled ('enabled' in array)
        if (!empty($national_free_shipping) && in_array('enabled', (array)$national_free_shipping)) {
            continue;
        }

        $country_of_origin = get_field('shipping_country_of_origin', $product_id);

        if ($customer_shipping_country === $country_of_origin) {
            $shipping_national_one_item_cost = get_field('shipping_national_one_item_cost', $product_id);
            $shipping_national_additional_items_cost = get_field('shipping_national_additional_items_cost', $product_id);
            $quantity = $cart_item['quantity'];

            $additional_shipping_cost = 0;
            if (is_numeric($shipping_national_one_item_cost)) {
                if (empty($shipping_national_additional_items_cost)) {
                    $additional_shipping_cost = $shipping_national_one_item_cost * $quantity;
                } else {
                    $additional_shipping_cost = $shipping_national_one_item_cost + $shipping_national_additional_items_cost * ($quantity - 1);
                }
            }

            if ($additional_shipping_cost > 0) {
                $base_price = $cart_item['data']->get_price();
                $new_price = ($base_price * $quantity) + $additional_shipping_cost;
                $cart_item['data']->set_price($new_price / $quantity);
            }
        }
        error_log("Final Additional Shipping Cost for Product $product_id: $additional_shipping_cost");
        error_log("Final Price for Product $product_id: " . $cart_item['data']->get_price());
    }
}
add_action('woocommerce_before_calculate_totals', 'kraftdeck_national_shipping_cost_logic');

function kraftdeck_get_full_country_name($country_code) { 
    $countries = WC()->countries->get_countries(); 
    $full_name = isset($countries[$country_code]) ? $countries[$country_code] : ''; 

    // Remove any parentheses and content within them 
    $full_name_cleaned = preg_replace('/\s+(.+)$/', '', $full_name); 
    return $full_name_cleaned; 
}

remove_action('woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10); 

I've tried everything to get this working, even ChatGPT cannot help!

0

There are 0 best solutions below