Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change product prices via a hook in WooCommerce 3+

Tags:

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.

Variation Price

Is there anything I'm missing, or something wrong?

like image 215
KronosL Avatar asked Aug 21 '17 22:08

KronosL


People also ask

How do I change product prices in WooCommerce?

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.

How do I change the variation price display in WooCommerce?

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.


1 Answers

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 using woocommerce_get_variation_prices_hash filter hook much more efficient, instead of wc_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
like image 110
LoicTheAztec Avatar answered Oct 02 '22 15:10

LoicTheAztec