Set product sale price programmatically in WooCommerce 3
The hook woocommerce_get_sale_price
is deprecated since WooCommerce 3 and replaced by woocommerce_product_get_sale_price
.
Also Product displayed prices are cached. When sale price is active, regular price is also active.
Try this instead:
// Generating dynamically the product "regular price"add_filter( 'woocommerce_product_get_regular_price', 'custom_dynamic_regular_price', 10, 2 );add_filter( 'woocommerce_product_variation_get_regular_price', 'custom_dynamic_regular_price', 10, 2 );function custom_dynamic_regular_price( $regular_price, $product ) { if( empty($regular_price) || $regular_price == 0 ) return $product->get_price(); else return $regular_price;}// Generating dynamically the product "sale price"add_filter( 'woocommerce_product_get_sale_price', 'custom_dynamic_sale_price', 10, 2 );add_filter( 'woocommerce_product_variation_get_sale_price', 'custom_dynamic_sale_price', 10, 2 );function custom_dynamic_sale_price( $sale_price, $product ) { $rate = 0.8; if( empty($sale_price) || $sale_price == 0 ) return $product->get_regular_price() * $rate; else return $sale_price;};// Displayed formatted regular price + sale priceadd_filter( 'woocommerce_get_price_html', 'custom_dynamic_sale_price_html', 20, 2 );function custom_dynamic_sale_price_html( $price_html, $product ) { if( $product->is_type('variable') ) return $price_html; $price_html = wc_format_sale_price( wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ), wc_get_price_to_display( $product, array( 'price' => $product->get_sale_price() ) ) ) . $product->get_price_suffix(); return $price_html;}
Code goes in function.php file of your active child theme (active theme).
Tested and works on single product, shop, product category and tag archive pages.
The continuation in:
Wrong Woocommerce cart item price after setting programmatically product sale price
I realiced, you more or less need all of the following filters to make the HTML work out of the box.
add_filter( 'woocommerce_product_get_price', 'custom_dynamic_sale_price', 10, 2 );add_filter( 'woocommerce_product_variation_get_price', 'custom_dynamic_sale_price', 10, 2 );add_filter( 'woocommerce_product_get_sale_price', 'custom_dynamic_sale_price', 10, 2 );add_filter( 'woocommerce_product_variation_get_sale_price', 'custom_dynamic_sale_price', 10, 2 );add_filter( 'woocommerce_variation_prices_price', 'custom_dynamic_sale_price', 10, 2 );add_filter( 'woocommerce_variation_prices_sale_price', 'custom_dynamic_sale_price', 10, 2 );
And you need to make sure you've changed the woocommerce_get_variation_prices_hash becasue of the stored transients if you want to display it correctly for variable products.
You may find the gist i've created for a client useful
https://gist.github.com/xandl/743fb6af60827eb95ad42b20b478b020
use woocomerce_get_sale_price filter.
add_filter('woocommerce_get_sale_price', 'my_custom_price', 99, 2);add_filter('woocommerce_get_price', 'my_custom_price', 99, 2);function my_custom_price( $price, $product ){ //your logic for calculating the new price here $price = $product->get_regular_price() * 0.8; //Return the new price (this is the price that will be used everywhere in the store) return $price;}