WooCommerce: Count Purchases By Product ID (Shortcode)

If you’re developing custom landing pages or sections dedicated to logged in customers, knowing the quantity purchased of a certain product ID might come useful.

We already saw how to detect whether a logged in customer has purchased a given product, as well as a snippet to return all products purchased by a specific user – but this time I want to “count” how many times a current user has purchased a product ID, and return this on the screen via a shortcode.

From this snippet you can learn lots of things, for example how to create custom shortcodes, how to get customer orders, and how to set up a foreach loop in PHP. Either way, enjoy!

Count how many times a WooCommerce product ID was purchased by current logged in customer

PHP Snippet: Count How Many Times a Product ID Was Purchased by Current User (WooCommerce Shortcode)

/**
 * @snippet       Count Product ID Purchases - WooCommerce Shortcode
 * @how-to        Watch tutorial @ https://businessbloomer.com/?p=19055
 * @author        Rodolfo Melogli
 * @compatible    WooCommerce 3.6.2
 * @donate $9     https://businessbloomer.com/bloomer-armada/
 */

// SHORTCODE SYNTAX: [product_purchases id="123"]
 
add_shortcode( 'product_purchases', 'bbloomer_user_logged_in_product_bought' );
 
function bbloomer_user_logged_in_product_bought( $atts ) {
	
	// GET PRODUCT ID FROM SHORTCODE
	$atts = shortcode_atts( array(
        'id' => '0'
    ), $atts );
	
	// GET CURRENT USER ORDERS
	$current_user = wp_get_current_user();	
	$customer_orders = wc_get_orders(
		array(
			'limit'    => -1,
			'status'   => array( 'completed', 'processing'),
			'customer' => get_current_user_id(),
		)
	);
	
	// LOOP THROUGH ORDERS AND SUM QUANTITIES PURCHASED
	$count = 0;
	foreach ( $customer_orders as $customer_order ) {
		$order = wc_get_order( $customer_order->get_id() );
		$items = $order->get_items();
		foreach ( $items as $item ) {
			$product_id = $item->get_product_id();
			if ( $product_id == $atts['id'] ) {
				$count = $count + absint( $item['qty'] ); 
			}
		}
	}
	
	// RETURN HTML
	return '<b>You purchased: ' . $count . ' items</b>';
	
}

Where to add this code?

You can place PHP snippets at the bottom of your child theme functions.php file (before "?>" if you have it). CSS, on the other hand, goes in your child theme style.css file. Make sure you know what you are doing when editing such delicate files - if you need more guidance, please take a look at my free WooCommerce Customization video tutorial.

Does this snippet still work?

Please let me know in the comments if everything worked as expected. I would be happy to revise the snippet if you report otherwise (please provide screenshots). I have tested this code with Storefront theme, the WooCommerce version listed above and a WordPress-friendly hosting on PHP 7.

If you think this code saved you time & money, please join other Business Bloomer supporters and avail of 365 days of WooCommerce benefits. Thank you in advance :)

Need Help with WooCommerce?

Check out these free videos, tutorials and tips!

  • how-to-edit-woocommerce-with-php-snippets
  • woocommerce-hooks-add_action-list-visual
  • woocommerce-customize-single-product-page-PHP
  • woocommerce-customize-shop-page-PHP
  • woocommerce-advanced-customization
  • how-to-edit-woocommerce-cart
  • woocommerce-customize-checkout-page-PHP
  • woocommerce-email-customization
  • woocommerce-conditional-logic

Rodolfo Melogli

Author, WooCommerce expert and WordCamp speaker, Rodolfo has worked as a WooCommerce freelancer since 2011. His goal is to help entrepreneurs and developers overcome their WooCommerce nightmares. Rodolfo loves travelling, chasing tennis & soccer balls and, of course, wood fired oven pizza.

Questions? Feedback? Support? Leave your Comment Now!
_____

If you are writing code, please wrap it between: [php]code_here[/php]. Failure to complying with this (as well as going off topic) will result in comment deletion. You should expect a reply in about a week - this is a popular blog but I need to get paid work done first. Please consider joining #BloomerArmada to ask me 1-to-1 WooCommerce questions. Thank you :)

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.