Change cart item prices in Woocommerce 3 Change cart item prices in Woocommerce 3 wordpress wordpress

Change cart item prices in Woocommerce 3


Update 2021 (Handling mini cart custom item price)

With WooCommerce version 3.0+ you need:

Here is the code:

// Set custom cart item priceadd_action( 'woocommerce_before_calculate_totals', 'add_custom_price', 1000, 1);function add_custom_price( $cart ) {    // This is necessary for WC 3.0+    if ( is_admin() && ! defined( 'DOING_AJAX' ) )        return;    // Avoiding hook repetition (when using price calculations for example | optional)    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )        return;    // Loop through cart items    foreach ( $cart->get_cart() as $cart_item ) {        $cart_item['data']->set_price( 40 );    }}

And for mini cart (update):

// Mini cart: Display custom price add_filter( 'woocommerce_cart_item_price', 'filter_cart_item_price', 10, 3 );function filter_cart_item_price( $price_html, $cart_item, $cart_item_key ) {    if( isset( $cart_item['custom_price'] ) ) {        $args = array( 'price' => 40 );        if ( WC()->cart->display_prices_including_tax() ) {            $product_price = wc_get_price_including_tax( $cart_item['data'], $args );        } else {            $product_price = wc_get_price_excluding_tax( $cart_item['data'], $args );        }        return wc_price( $product_price );    }    return $price_html;}

Code goes in functions.php file of your active child theme (or active theme).

This code is tested and works (still works on WooCommerce 5.1.x).

Note: you can increase the hook priority from 20 to 1000 (or even 2000) when using some few specific plugins or others customizations.

Related:


With WooCommerce version 3.2.6, @LoicTheAztec's answer works for me if I increase the priority to 1000.

add_action( 'woocommerce_before_calculate_totals', 'add_custom_price', 1000, 1);

I tried priority values of 10,99 and 999 but the price and total in my cart did not change (even though I was able to confirm with get_price() that set_price() had actually set the price of the item.

I have a custom hook that adds a fee to my cart and I'm using a 3rd party plugin that adds product attributes. I suspect that these WooCommerce "add-ons" introduce delays that require me to delay my custom action.