3

in our Woocommerce store we have some minimum price for any products . And in every product inner page there is two filed where customer can type width , height of the product . And then they can add this product to cart, then price is changed based on given width and height.

For example if the minimum price for a product is 50 . And customer add width =2, height=3 , then the price for this product is going to 50*2*3=300

So to arrange this we add this code to function.php

add_filter( 'woocommerce_add_cart_item', 'add_custom_cart_item_data', 10, 2 );
function add_custom_cart_item_data( $cart_item_data, $cart_item_key ) {

   $result=$_POST['width']*$_POST['height']*$cart_item_data['data']->price;

   $cart_item_data['new-price'] =$result;

   $cart_item_data['data']->set_price($result);

   return $cart_item_data;
}

So this is working correctly .

But the problem is once it is coming to checkout page then the product price is showing as 50 , but it is 300 actually.

so to overcome this i use the following code

add_filter( 'woocommerce_cart_item_subtotal', 'update_with_custom_details', 10, 3 ); 
function update_with_custom_details( $subtotal, $cart_item, $cart_item_key ) {
     $subtotal =" £".$cart_item['line_total'];
     return $subtotal;
}

now it is showing £300, but i know this code is wrong.

The code is wrong because when customer apply a 50% coupon code for this product then the discount is coming as 25 , Because it calculating based on 50*.5=25; But actually product new price is 300, so the discount should be 300*5=150;

So how i can update the product price in cart page, checkout page ,mini cart etc ?

Please help .

Please see this also Woocommerce product custom price is not accepted by wocommerce coupon

Abilash Erikson
  • 341
  • 4
  • 26
  • 55

1 Answers1

4

Update 2: The correct way to do it need to be done in two steps:

  • We calculate the price on add to cart event hook and save it as custom cart item data.
  • We set that calculated price in woocommerce_before_calculate_totals hook

The code:

// Save custom field value in cart item as custom data
add_filter( 'woocommerce_add_cart_item_data', 'calculate_custom_cart_item_prices', 30, 3 );
function calculate_custom_cart_item_prices( $cart_item_data, $product_id, $variation_id ) {
    if ( isset($_POST['width']) && isset($_POST['height']) ) {
        // Get the correct Id to be used (compatible with product variations)
        $the_id = $variation_id > 0 ? $variation_id : $product_id;

        $product = wc_get_product( $the_id ); // Get the WC_Product object
        $product_price = (float) $product->get_price(); // Get the product price

        // Get the posted data
        $width  = (float) sanitize_text_field( $_POST['width'] );
        $height = (float) sanitize_text_field( $_POST['height'] );

        $new_price = $width * $height * $product_price; // Calculated price

        $cart_item_data['calculated-price'] = $new_price; // Save this price as custom data
    }
    return $cart_item_data;
}

// Set custom calculated price in cart item price
add_action( 'woocommerce_before_calculate_totals', 'set_calculated_cart_item_price', 20, 1 );
function set_calculated_cart_item_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item ){
        if( ! empty( $cart_item['calculated-price'] ) ){
            // Set the calculated item price (if there is one)
            $cart_item['data']->set_price( $cart_item['calculated-price'] );
        }
    }
}

Code goes in function.php file of your active child theme (or theme). Tested and works.


For testing purpose, I have used the following code that output 2 custom fields on single product pages:

// The hidden product custom field
add_action( 'woocommerce_before_add_to_cart_button', 'add_gift_wrap_field' );
function add_gift_wrap_field() {
    global $product;
    // The fake calculated price
    ?>
        <div>
            <label class="product-custom-text-label" for="servicetime"><?php _e( 'Custom text:', 'woocommerce'); ?><br>
                <input type="text" id="user-width" name="width" value=""><br>
                <input type="text" id="user-height" name="height" value="">
            </label>
        </div><br>
    <?php
}
LoicTheAztec
  • 229,944
  • 23
  • 356
  • 399
  • But still when i applied coupon then it is take discount based on the product orginal price , not based on the product custom price . – Abilash Erikson Mar 22 '18 at 04:51
  • @abilasher I have tested up my code with coupons and I don't have this problem… I have added the code that I use to have 2 custom fields in single product pages, for testing. When I apply coupons everything still correct. So you have something somewhere that is making a problem. For me it works just fine. – LoicTheAztec Mar 22 '18 at 10:58