IN WooCommerce, I need to multiply all product prices by a number. So I have used the following (via a plugin):
add_filter('woocommerce_get_regular_price', array( $this, 'my_custom_price'), 99); add_filter('woocommerce_get_price', array( $this, 'my_custom_price'), 99); function my_custom_price( $original_price ) { global $post, $woocommerce; //Logic for calculating the new price here $new_price = $original_price * 2; //Return the new price (this is the price that will be used everywhere in the store) return $new_price; }
But, that doesn’t work for variation products. I have tried the following hooks with no luck:
add_filter('woocommerce_get_variation_regular_price', array( $this, 'my_custom_price'), 99); add_filter('woocommerce_get_variation_price', array( $this, 'my_custom_price'), 99);
The only one that works half way is this one:
add_filter('woocommerce_variation_prices_price', array( $this, 'my_custom_price'), 99);
But that just changed the overall price, not the selected variation price. See the image below, price is BsF. 200 and the overall price is right, 200 x 2 = 400, but the variation price when selected still shows 200:
Note: I need it to actually change, so display html hooks wont work.
Is there anything I’m missing, or something wrong?
Advertisement
Answer
Update (December 2020)
- 2 code versions for themes and plugins (works in Woocommerce 3.3.x too)
- Cached variations prices in Woocommerce 3 (Update and addition):
Now usingwoocommerce_get_variation_prices_hash
filter hook much more efficient, instead ofwc_delete_product_transients()
… See this related thread- Added product price filter widget hooks (see at the end).
1) Plugin version with a constructor function:
The hooks that you are using are deprecated in WooCommerce 3+
To make it work for all products prices, including variations prices, you should use this:
## The following goes inside the constructor ## // Simple, grouped and external products add_filter('woocommerce_product_get_price', array( $this, 'custom_price' ), 99, 2 ); add_filter('woocommerce_product_get_regular_price', array( $this, 'custom_price' ), 99, 2 ); // Variations add_filter('woocommerce_product_variation_get_regular_price', array( $this, 'custom_price' ), 99, 2 ); add_filter('woocommerce_product_variation_get_price', array( $this, 'custom_price' ), 99, 2 ); // Variable (price range) add_filter('woocommerce_variation_prices_price', array( $this, 'custom_variable_price' ), 99, 3 ); add_filter('woocommerce_variation_prices_regular_price', array( $this, 'custom_variable_price' ), 99, 3 ); // Handling price caching (see explanations at the end) add_filter( 'woocommerce_get_variation_prices_hash', array( $this, 'add_price_multiplier_to_variation_prices_hash' ), 99, 3 ); ## This goes outside the constructor ## // Utility function to change the prices with a multiplier (number) public function get_price_multiplier() { return 2; // x2 for testing } public function custom_price( $price, $product ) { return (float) $price * get_price_multiplier(); } public function custom_variable_price( $price, $variation, $product ) { return (float) $price * get_price_multiplier(); } public function add_price_multiplier_to_variation_prices_hash( $price_hash, $product, $for_display ) { $price_hash[] = get_price_multiplier(); return $price_hash; }
The code tested and perfectly works (only) in WooCommerce 3+.
2) For theme version: functions.php
file on active child theme (or active theme):
// Utility function to change the prices with a multiplier (number) function get_price_multiplier() { return 2; // x2 for testing } // Simple, grouped and external products add_filter('woocommerce_product_get_price', 'custom_price', 99, 2 ); add_filter('woocommerce_product_get_regular_price', 'custom_price', 99, 2 ); // Variations add_filter('woocommerce_product_variation_get_regular_price', 'custom_price', 99, 2 ); add_filter('woocommerce_product_variation_get_price', 'custom_price', 99, 2 ); function custom_price( $price, $product ) { return (float) $price * get_price_multiplier(); } // Variable (price range) add_filter('woocommerce_variation_prices_price', 'custom_variable_price', 99, 3 ); add_filter('woocommerce_variation_prices_regular_price', 'custom_variable_price', 99, 3 ); function custom_variable_price( $price, $variation, $product ) { // Delete product cached price (if needed) // wc_delete_product_transients($variation->get_id()); return (float) $price * get_price_multiplier(); } // Handling price caching (see explanations at the end) add_filter( 'woocommerce_get_variation_prices_hash', 'add_price_multiplier_to_variation_prices_hash', 99, 3 ); function add_price_multiplier_to_variation_prices_hash( $price_hash, $product, $for_display ) { $price_hash[] = get_price_multiplier(); return $price_hash; }
Tested and works on woocommerce 3+
For products in sale you have those hooks:
woocommerce_product_get_sale_price
(Simple, grouped and external products)woocommerce_variation_prices_sale_price
(Variable products (min-max))woocommerce_product_variation_get_sale_price
(Products variations)
Cached prices and woocommerce 3:
The 3 filters hooks involved in variations cached prices are:
woocommerce_variation_prices_price
woocommerce_variation_prices_regular_price
woocommerce_variation_prices_sale_price
Introduced in Woocommerce 3,
woocommerce_get_variation_prices_hash
filter hook will allow to refresh variations cached prices in a much more efficient way, without deleting related transients anytime that this hooks are executed.
So performances will stay boosted (Thanks to Matthew Clark that pointed this better way)
See: Caching and dynamic pricing – upcoming changes to the get_variation_prices method
For filtering product prices with a widget (min and max price), use the following hooks:
woocommerce_price_filter_widget_min_amount
that has one argument$price
woocommerce_price_filter_widget_max_amount
that has one argument$price