Every time an order is placed on your WooCommerce website, the purchased products’ total_sales counter increases thanks to a core function. It’s then easy to retrieve the value and maybe show the number of sales on the single product page, which is great for social proof and sales conversion rate optimization.
The big problem – and don’t ask me why this is not into core – is that if you need to refund an order (or cancel it), the total_sales counter will not reset / decrease, which is odd.
Today we’ll fix this, so that your products are always up to date with their sales counter and you can be more confident in showing the correct values. Enjoy!
PHP Snippet: Decrease Product Sales Counter In Case Of a Refund
/**
* @snippet Customer Conditional Content Shortcode
* @tutorial Get CustomizeWoo.com FREE
* @author Rodolfo Melogli, Business Bloomer
* @compatible WooCommerce 8
* @community Join https://businessbloomer.com/club/
*/
add_action( 'woocommerce_order_status_cancelled', 'bbloomer_maybe_decrease_product_total_sales' );
add_action( 'woocommerce_order_status_refunded', 'bbloomer_maybe_decrease_product_total_sales' );
function bbloomer_maybe_decrease_product_total_sales( $order_id ) {
$order = wc_get_order( $order_id );
if ( ! $order ) return; // MUST BE AN ORDER
if ( ! $order->get_data_store()->get_recorded_sales( $order ) ) return; // WITH RECORDED SALES STATUS
if ( count( $order->get_items() ) > 0 ) {
foreach ( $order->get_items() as $item ) {
$product_id = $item->get_product_id();
if ( $product_id ) {
$data_store = WC_Data_Store::load( 'product' );
$data_store->update_product_sales( $product_id, absint( $item->get_quantity() ), 'decrease' );
}
}
}
$order->get_data_store()->set_recorded_sales( $order, false ); // REMOVE RECORDED SALES STATUS
do_action( 'woocommerce_recorded_sales', $order_id );
}