WooCommerce: Add product to cart with price override?

$replace_order = new WC_Cart();
$replace_order->empty_cart( true );
$replace_order->add_to_cart( "256", "1");

The above code add product 256 to the Cart 1 time. But the issue I’m having is that I want to be able to completely override the product price… as far as I can tell, the only thing I can do it apply a coupon to the Cart.

Is there a way to completely override the price to something totally custom?

Related posts

Leave a Reply

10 comments

  1. Here is the code for overriding price of product in cart

    add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
    
    function add_custom_price( $cart_object ) {
        $custom_price = 10; // This will be your custome price  
        foreach ( $cart_object->cart_contents as $key => $value ) {
            $value['data']->price = $custom_price;
            // for WooCommerce version 3+ use: 
            // $value['data']->set_price($custom_price);
        }
    }
    

    Hope it will be useful…

  2. You need to introduce an if statement for checking product id, in above code:

    add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
    
    function add_custom_price( $cart_object ) {
        $custom_price = 10; // This will be your custome price  
        $target_product_id = 598;
        foreach ( $cart_object->cart_contents as $value ) {
            if ( $value['product_id'] == $target_product_id ) {
                $value['data']->price = $custom_price;
            }
            /*
            // If your target product is a variation
            if ( $value['variation_id'] == $target_product_id ) {
                $value['data']->price = $custom_price;
            }
            */
        }
    }
    

    Add this code anywhere and make sure that this code is always executable.

    After adding this code, when you’ll call:

    global $woocommerce; 
    $woocommerce->cart->add_to_cart(598);
    

    Only this product will be added with overridden price, other products added to cart will be ignored for overriding prices.

    Hope this will be helpful.

  3. I have tried all above code samples and latest woocommerce 3.0 is not support any of the above example. Use below code and working perfectly for me.

    add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
    
    function add_custom_price( $cart_object ) {
        $custom_price = 10; // This will be your custom price  
        foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
            $cart_item['data']->set_price($custom_price);   
        }
    }
    
  4. After release of woocommerce version 3.0.0 product price is update on add to cart using set_price($price) function. The example is given as below :

    add_action( 'woocommerce_before_calculate_totals', 'mj_custom_price' );
    
    function mj_custom_price( $cart_object ) {
       $woo_ver = WC()->version; 
       $custom_price = 10;
       foreach ( $cart_object->cart_contents as $key => $value )
       {
           if($woo_ver < "3.0.0" && $woo_ver < "2.7.0")
           {
               $value['data']->price = $custom_price;
           }
           else
           {
               $value['data']->set_price($custom_price);
           }
       }            
    }
    

    Many Thanks

  5. For the WordPress and Woocommerce latest version,Please use like this

    add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
    
    function add_custom_price( $cart_object ) {
        foreach ( $cart_object->cart_contents as $key => $value ) {
            $custom_price = 5;
            $value['data']->set_price($custom_price); 
        }
    }
    
  6. For eveeryone that got here from Google. The above is now deprecated as i found out updating to WooCommerce 3.0.1.

    Instead of the above you now need to use set_price instead of price

    Here is an example:

    add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
    function add_custom_price( $cart_object ) {
        $custom_price = 10; // This will be your custome price  
        foreach ( $cart_object->cart_contents as $key => $value ) {
            $value['data']->set_price = $custom_price;
        }
    }
    

    I hope this helps people in the future 🙂

  7. This is how i did it, first i add my custom price to cart_item_data witch can save custom data to cart items, then i use woocommerce_before_calculate_totals, loop the cart and add the previously added price.

    function add_donation_to_cart() { 
    
        $cart_item_data = array('price' => $_REQUEST['donate_amount']);
        $woocommerce->cart->add_to_cart( 5395, 1, '', array(), $cart_item_data);
    }
    
    
    add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
    
    function add_custom_price( $cart ) {
        foreach ( $cart->cart_contents as $key => $value ) {
            $value['data']->price = $value['price'];
        }
    }
    
  8. With WooCommerce 2.5 I found this to be a 2-part process. The first step is to change the run-time display of pricing when added to the cart via the woocommerce_add_cart_item filter. The second part is to set the persistent session data which is read during checkout via the woocommerce_get_cart_item_from_session filter. This seems to be faster than hooking the calculate totals filters (such as woocommerce_before_calculate_totals) as they are run very frequently in WooCommerce.

    More details here:
    woocommerce change price while add to cart

  9. To make it dynamic ( override price for each item in cart separately ), you need to save the override product price in session with cart item key as session key using woocommerce_add_to_cart hook.

    by using these session values you can calculate correct Cart Total and make the altered price appear in the Order Item as well

  10. You can use the following

    add_filter( 'woocommerce_cart_item_price', 'kd_custom_price_message' );
    
    function kd_custom_price_message( $price ) {
    
            $textafter = ' USD'; 
            return $price . $textafter;
    }