WooCommerce: Show Related Products In a Blog Post!

Maybe because I’m Italian, but I like exclamation marks! Also, Italian gestures – of course. With that being said, today we look at an amazing WooCommerce customization.

I’ve finally gained back some free time to work on my personal projects, and one of these is an affiliate website. In order to drive traffic to this WooCommerce website, we have a major content strategy and we publish 7 relevant posts per month.

However, it’s difficult to drive blog readers to the shop page, so I came up with a great idea – why not adding a grid of relevant related products at the end of each blog post, based on the most used keywords?

The rationale behind this is quite easy:

  1. you have a list of product tags
  2. you have a blog post full of words
  3. you count and define the most mentioned product tag
  4. you show 10 products from that product tag

Cool, ha? Well, let’s take a look at my code, and feel free to use it on your install!

This blog post is clearly about Sicilian wine, and mentions the word “vino” several times. The snippet below is able to find that out, and add a “Related Products” to the bottom of the blog post with 10 products belonging to the “vino” product tag. Amazing!

PHP Snippet: Show Related Products In a Blog Post Based on The Most Mentioned Product Tag

Important note: right at the beginning of the snippet, you must first build manually (or find an automatic way to build it) an array of “BLOG POST WORD” -> “PRODUCT TAG SLUG” relationships. This is unless your products tag slugs are exactly identical (case sensitive) to the words you want to count inside the blog post.

Other cool stuff inside the snippet:

  • We loop through the array and use substr_count, a cool PHP function that counts how many times a substring is mentioned in a string, to count how many times our “WORDS” (array keys) are mentioned in the blog post content. During the loop I basically use the $max variable to store the greatest count, and in such case I overwrite the $top_tag variable with the current tag slug
  • Once the loop is completed, if at least one tag slug was found, I simply use the WooCommerce [products] shortcode with the “tag” attribute, so that I can get a list of products within that product tag!
 * @snippet       Related Products @ Blog Post
 * @how-to        Get CustomizeWoo.com FREE
 * @author        Rodolfo Melogli
 * @compatible    WooCommerce 7
 * @community     https://businessbloomer.com/club/

add_filter( 'the_content', 'bbloomer_blog_post_related_products' );

function bbloomer_blog_post_related_products( $text ) {
	if ( is_singular( 'post' ) ) {
		$word_to_tag = array(
			'pasta' => 'pasta-2',
			'pizza' => 'sicilian-pizza',
			'spaghetti' => 'spag',
		$max = 0;
      $top_tag = '';
		foreach ( $word_to_tag as $word => $tag_slug ) {
			if ( substr_count( $text, $word ) > $max ) {
				$max = substr_count( $text, $word );
				$top_tag = $tag_slug;
		if ( $top_tag ) $text .= '<h2>Related Products</h2>' . do_shortcode( '[products columns="5" limit="10" tag="' . $top_tag . '"]' );
	return $text;

Where to add custom code?

You should place custom PHP in functions.php and custom CSS in style.css of your child theme: where to place WooCommerce customization?

This code still works, unless you report otherwise. To exclude conflicts, temporarily switch to the Storefront theme, disable all plugins except WooCommerce, and test the snippet again: WooCommerce troubleshooting 101

Related content

  • WooCommerce: Custom Related Products
    WooCommerce picks related products on the Single Product Page based on product categories and/or product tags. Related products are very important to the shopping experience, and sometimes this is not enough – what if you want to automatically show certain products based on different criteria? So, here’s a quick snippet to e.g. get related products […]
  • WooCommerce: Related Products in a Custom Tab @ Single Product Page
    This is a simple snippet that will allow you to move the Related Products from below the tabs to inside the single product tabs, in a brand new tab.
  • WooCommerce: Checkbox to Disable Related Products Conditionally
    Here’s how you can display a “checkbox” in the product edit page in order to hide the Related Products section in case this is checked. This is something you can also reuse to hide other sections in the same way – for example you might need to hide product tabs or featured image in certain […]
  • WooCommerce: How to Remove Related Products
    Some store owners like to keep their product pages as clutter-free as possible. They want to remove all the unnecessary stuff and keep the focus of the page about the particular product. On the WooCommerce single product page, you will find 3 (or more) related products. In this tutorial, we will show you how to […]
  • WooCommerce: Get Product IDs (All, by Tag, by Category)
    When you work with WooCommerce PHP snippets, you often need to “get” stuff off your WordPress database in order to make some calculations and return the result on the screen. And if there is something I often google is “How do I get all my store’s product IDs?“. Thankfully the wc_get_products WooCommerce function gives us […]

Rodolfo Melogli

Business Bloomer Founder

Author, WooCommerce expert and WordCamp speaker, Rodolfo has worked as an independent 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. Follow @rmelogli

Questions? Feedback? Customization? Leave your comment now!

If you are writing code, please wrap it like so: [php]code_here[/php]. Failure to complying with this, as well as going off topic or not using the English language will result in comment disapproval. You should expect a reply in about 2 weeks - this is a popular blog but I need to get paid work done first. Please consider joining the Business Bloomer Club to get quick WooCommerce support. Thank you!

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