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?
Change product pricing on WooCommerce The easiest way to change or set the price of a product without the use of any plugin is by going to the WordPress dashboard > Products and hovering the cursor over the product you want to change the price of and clicking the edit button.
Install the plugin on your WordPress website and activate it. Once that's done, head over to WooCommerce → Settings → Products → Variation prices to activate the license key. Click the Save changes button to continue. Now that the plugin is activated, you can choose the format for your variation prices.
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) 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With