简体   繁体   中英

Woocommerce Mini Cart Widget product price override

is it possible to change product price in Woocommerce Mini Cart Widget? I've overrided price in cart using tips from WooCommerce: Add product to cart with price override? but it only works for cart page. Prices in widget are not changed.

Instead of using "woocommerce_before_calculate_totals" you can use "woocommerce_cart_item_price" filter, some thing like

add_filter('woocommerce_cart_item_price','modify_cart_product_price',10,3);

function modify_cart_product_price( $price, $cart_item, $cart_item_key){
    $price = wc_price($custom_price, 4); 
    return $price;
}

This is how I set price to 0 for free products:

function set_free_items_price( $price, $cart_item, $cart_item_key ) {

     $returned_item_price = $cart_item['data']->get_price();

     if (isset($cart_item['free_item']['value'])
         && $cart_item['free_item']['value'] == true) {
         $returned_item_price = 0;
     }

     return get_woocommerce_currency_symbol() . $returned_item_price;
}

I hooked inside class, so it hook looks like this:

add_filter( 'set_free_items_price', array(__CLASS__, 'woocommerce_cart_item_price_filter'), 10, 3 );

But if you are using it as procedural function, your hook should look like this:

add_filter( 'set_free_items_price', 'woocommerce_cart_item_price_filter', 10, 3 );

Keep in mind this is also affecting price row in regular cart. And, if you are not seeing changes in mini cart, try to update cart on regular cart page, and the go back and check again if mini-cart values has been changed.

To change the price on the WooCommerce Mini Cart Widget you have to use this filter hook: woocommerce_widget_cart_item_quantity

You can check the line 63 of the file: woocommerce/templates/cart/mini-cart.php to see how the filter hook is created.

apply_filters( 'woocommerce_widget_cart_item_quantity', '<span class="quantity">' . sprintf( '%s &times; %s', $cart_item['quantity'], $product_price ) . '</span>', $cart_item, $cart_item_key );

As the name of the filter hook indicates it can be used not only for the price but also to show the quantity.

For example you can use it to apply a discount to certain products based on a condition. In this case I used a value stored in the meta data of the product.

add_filter('woocommerce_widget_cart_item_quantity', 'custom_wc_widget_cart_item_quantity', 10, 3 );

function custom_wc_widget_cart_item_quantity( $output, $cart_item, $cart_item_key ) {
  $product_id = $cart_item['product_id'];
  // Use your own way to decide which product's price should be changed
  // In this case I used a custom meta field to apply a discount
  $special_discount = get_post_meta( $product_id, 'special_discount', true );
  if ($special_discount) {
    $price = $cart_item['data']->get_price();
    $final_price = $price - ( $price * $special_discount );
    // The final string with the quantity and price with the discount applied
    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'], $final_price, get_woocommerce_currency_symbol() );
  } else {
    // For the products without discount nothing is done and the initial string remains unchanged
    return $output;
  }
}

Note that this will only change how price is displayed, if you have to change it internally use also this action hook: woocommerce_before_calculate_totals

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM