We’ve already studied how to display the number of sales for a given product ID via a shortcode – however that solution won’t work for a variation ID, because WooCommerce only counts the “parent product” sales.
We need a different workaround in this case. This will require we either query the orders that contain such variation ID, and then calculate the sum – or that we install a snippet on day 0 so that we can count variation sales from that moment onwards, without having to query and calculate anything.
We will study the latter, and then display the result via a shortcode, so that you can use it anywhere, even inside the variation description.
Enjoy!
PHP Snippet: Shortcode to Display The Total Sales by Variation ID
/**
* @snippet Variation Sales Counter
* @how-to businessbloomer.com/woocommerce-customization
* @author Rodolfo Melogli, Business Bloomer
* @compatible WooCommerce 8
* @community https://businessbloomer.com/club/
*/
// PART 1: variation sales counter
// This needs to be installed on day 0
// There is also a way to make it retroactive with a one-off operation of course
add_action( 'woocommerce_recorded_sales', 'bbloomer_maybe_update_variation_sales' );
function bbloomer_maybe_update_variation_sales( $order_id ) {
$order = wc_get_order( $order_id );
if ( ! $order ) return;
if ( count( $order->get_items() ) > 0 ) {
foreach ( $order->get_items() as $item ) {
if ( 'product_variation' === get_post_type( $item->get_variation_id() ) ) {
$variation_id = $item->get_variation_id();
$total_sales = get_post_meta( $variation_id, '_total_sales', true ) ? get_post_meta( $variation_id, '_total_sales', true ) : 0;
update_post_meta( $variation_id, '_total_sales', $total_sales + absint( $item->get_quantity() ) );
}
}
}
}
// PART 2: variation sales shortcode
// usage: [var_sales id="123"]
add_shortcode( 'var_sales', 'bbloomer_sales_by_variation_id' );
function bbloomer_sales_by_variation_id( $atts ) {
return get_post_meta( $atts['id'], '_total_sales', true ) ? get_post_meta( $atts['id'], '_total_sales', true ) : 0;
}