Woocommerce Mini Cart Widget product price override

后端 未结 3 1424
长发绾君心
长发绾君心 2021-01-23 17:19

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 i

相关标签:
3条回答
  • 2021-01-23 17:34

    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.

    0 讨论(0)
  • 2021-01-23 17:34

    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

    0 讨论(0)
  • 2021-01-23 17:49

    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;
    }
    
    0 讨论(0)
提交回复
热议问题