vovafeldman
vovafeldman

Reputation: 605

Shopify liquid: How can I conditionally include snippets in Shopify liquid?

I would like to include a snippet in a template but only if the snippet file exist. Is there any way I can do it?

Now I'm just using:

{% include 'snippetName' %}

But this throws the error:

Liquid error: Could not find asset snippets/snippetName.liquid

The reason I need such a functionality is because I have a background process that adds the snippet later on.

Upvotes: 10

Views: 9701

Answers (6)

Rohit Gupta
Rohit Gupta

Reputation: 3261

Okay, Coming here in 2021.

The include syntax is deprecated and infrequently used, also extending @a.wmly answer, this should be the latest syntax replacing include with render:

{% capture snippet_content %}{% render 'your-snippet-name' %}{% endcapture %}
{% if snippet_content contains "Could not find asset" %}
    {% comment %} do nothing {% endcomment %}
{% else %}
    {% render 'your-snippet-name' %}
{% endif %}

references for include vs render : https://shopify.dev/docs/themes/liquid/reference/tags/deprecated-tags#include

Upvotes: 4

BGitlin
BGitlin

Reputation: 51

Using the code listed above by Jon or a.wmly both still gave me errors. However, simply writing

{% include 'snippet_name' %}

worked just fine.

Note that this only worked for files located in the "snippets/" folder. So Templates, for instance, did not work using this method.

Upvotes: 0

a.wmly
a.wmly

Reputation: 41

Extending on Jon's answer;

Create a file called snippet.liquid

{% capture snippet_content %}{% include snippet %}{% endcapture %}
{% unless snippet_content contains "Liquid error" %}
  {{ snippet_content }}
{% endunless %}

Then when you want to include a file only if it exists

{% include 'snippet' with 'filename_of_include' %}

Upvotes: 4

aidan
aidan

Reputation: 9576

Alternatively, you could create your own tag which does a check on the existence of the file, before attempting to process it.

https://github.com/Shopify/liquid/wiki/Liquid-for-Programmers#create-your-own-tags

Upvotes: 1

Jon Heslop
Jon Heslop

Reputation: 256

Had this problem myself. This was my solution:

{% capture the_snippet_content %}{% include the_snippet %}{% endcapture %}
{% unless the_snippet_content contains "Liquid error" %}
  {% include reviews_snippet %}
{% endunless %}

Basically capture the snippet’s content as a variable. If there is no snippet Shopify generates the error:

Liquid error: Could not find asset snippets/caroline-flint-reviews.liquid

So check to see if it’s generated that… if so don’t print the snippet :D

Of course this would break if you intended your snippet to include "Liquid error" or if Shopify ever change the error message.

Upvotes: 24

meeech
meeech

Reputation: 1397

@vovafeldman Not sure why you can't have a blank snippet, but there's no file exists.

The only other option I can think of is since you are using a BG process to generate the snippet (and I assume upload it), you can always use the template API to upload the version of the template that includes the snippet at the same time.

Upvotes: 0

Related Questions