title: Related Products by Tag in Shopify
body: <p>I've built out a liquid template to compare the tags of a current products with the tags of all the other products in the store and display four as related products at the bottom of the page.</p>
  
  <p>It works, but I think I've done it quite inefficiently. Is there a way to make this work a little better?</p>
  
  <pre><code>{% if settings.products_per_row == "4" %}
  {% assign number_of_related_products_to_show = 4 %}
  {% elsif settings.products_per_row == "3" %}
  {% assign number_of_related_products_to_show = 3 %}
  {% else %}
  {% assign number_of_related_products_to_show = 2 %}
  {% endif %}
  
  {% assign number_of_related_products_to_fetch = number_of_related_products_to_show | plus: 1 %}
  {% assign current_product_tags = product.tags %}
  
  {% for c in collections %}
      {% if c.handle == 'all' %}
          {% assign collection_all = c %}
      {% endif %}
  {% endfor %}
  
  {% assign found_first_match = false %}
  {% assign found_second_match = false %}
  {% paginate collection_all.products by 1000 %}
  {% for product in collection_all.products %}
  {% for tag in product.tags %}
      {% if current_product_tags contains tag and found_first_match == false and tag != 'Made in USA' %}
          {% assign found_first_match = true %}
          {% assign first_match = tag %}
      {% endif %}
      {% if current_product_tags contains tag and found_first_match == true and tag != first_match and tag != 'Made in USA' %}
          {% assign found_second_match = true %}
          {% assign second_match = tag %}
      {% endif %}
  {% endfor %}
  {% endfor %}
  {% endpaginate %}
  
  {% assign matches_found = false %}
  {% assign current_product = product %}
  {% assign current_product_found = false %}
  
  {% paginate collection_all.products by 1000 %}
  {% for product in collection_all.products %}
    {% if product.handle == current_product.handle %}
      {% assign current_product_found = true %}
    {% else %}
      {% if product.tags contains first_match %}
        {% unless current_product_found == false and forloop.last %}
          {% assign matches_found = true %}
        {% endunless %}
      {% endif %}
      {% if product.tags contains second_match and matches_found == false  %}
        {% unless current_product_found == false and forloop.last %}
          {% assign matches_found = true %}
        {% endunless %}
      {% endif %}
    {% endif %}
  {% endfor %}
  {% endpaginate %}
  
  {% if matches_found == true %}
  
  &lt;div class="row"&gt;
    &lt;div class="span12"&gt;
      &lt;h3 class="collection-title"&gt;Related products&lt;/h3&gt;
    &lt;/div&gt;
  &lt;/div&gt; 
  
  &lt;div class="row products"&gt;
  
  {% paginate collection_all.products by 1000 %}
  {% for product in collection_all.products %}
    {% if product.handle == current_product.handle %}
      {% assign current_product_found = true %}
    {% else %}
      {% if product.tags contains first_match %}
        {% unless current_product_found == false and forloop.last %}
          {% include 'related-product-loop' with collection.handle %}
          {% assign matched_product = product.title %}
        {% endunless %}
      {% endif %}
      {% if product.tags contains second_match %}
        {% unless current_product_found == false and forloop.last or matched_product == product.title %}
          {% include 'related-product-loop' with collection.handle %}
        {% endunless %}
      {% endif %}
    {% endif %}
  {% endfor %}
  {% endpaginate %}
  
  &lt;/div&gt;
  
  {% endif %}
  
  {{ 'jquery.pick.js' | asset_url | script_tag }}
  &lt;script type="text/javascript" charset="utf-8"&gt;
  //&lt;![CDATA[
  var howMany = {{ number_of_related_products_to_show }};
  jQuery(function() {
    jQuery('.products .product').pick(howMany);
  });
  //]]&gt;
  &lt;/script&gt;
  </code></pre>
  
  <p>I'm using jquery.pick.js to randomly display four of the products.</p>
  
  <p>Thoughts?</p>