Change product prices via a hook in WooCommerce 3+ Change product prices via a hook in WooCommerce 3+ wordpress wordpress

Change product prices via a hook in WooCommerce 3+


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 productsadd_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 productsadd_filter('woocommerce_product_get_price', 'custom_price', 99, 2 );add_filter('woocommerce_product_get_regular_price', 'custom_price', 99, 2 );// Variationsadd_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