Search code examples
phpwordpresswoocommercecustom-fieldsminicart

Also change WooCommerce Minicart item price based on product custom field


Based on Allow customer to set the product price (giftcard) and add to cart if sum is minimum 100 in WooCommerce, which answers my initial question - I am left with one small problem regarding the WooCommerce minicart.

The product price is not updated accordingly to what the customer submits using the giftcard field. So I have two different solutions whereof both fail.

This is what I tried:

add_filter('woocommerce_widget_cart_item_quantity', 'custom_wc_widget_cart_item_quantity', 10, 3 );
function custom_wc_widget_cart_item_quantity( $cart, $cart_item, $cart_item_key ) {

    foreach ( $cart->get_cart() as $cart_item ) {

        if ( isset ( $cart_item['giftcard_product_price'] ) ) {

        $cart_item['data']->set_price( $cart_item['giftcard_product_price'] );

        return sprintf( '<span class="quantity">%s &times; <span class="woocommerce-Price-amount amount">%s <span class="woocommerce-Price-currencySymbol">%s</span></span></span>', $cart_item['quantity'], $cart_item['giftcard_product_price'] );
        }
    }
}

It doesn't work: Minicart go blank. Then I tried also:

add_filter('woocommerce_cart_item_price','modify_cart_product_price',10,3);
function modify_cart_product_price( $price, $cart_item, $cart_item_key){
    $price = $cart_item['data']->set_price($cart_item['giftcard_product_price']);
    return $price;
}

Any help I can get would be grateful.


Solution

  • The right hook to be used is woocommerce_cart_item_price this way:

    add_filter( 'woocommerce_cart_item_price', 'giftcard_cart_item_price', 10, 3 );
    function giftcard_cart_item_price( $price_html, $cart_item, $cart_item_key ) {
        $giftcard_key = 'giftcard_product_price';
    
        if( isset( $cart_item[$giftcard_key] ) ) {
            $args = array( 'price' => floatval( $cart_item[$giftcard_key] ) );
    
            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;
    }
    

    Now the custom price will appear correctly in minicart...