theme-shopify-liquid-templates
Shopify Liquid Templates
Best practices for Liquid templates, snippets, logic flow, image handling, and SVG usage in Shopify themes.
When to Use
- Creating or modifying Liquid templates
- Working with snippets
- Handling images and media
- Writing Liquid logic
- Using SVG icons
Snippets
Usage
- Use
{% render %}only (neverinclude) - Inside each snippet, add a Usage block at the top
Snippet Structure
{%- comment -%}
Usage:
{% render 'snippet-name', param: value, another_param: value %}
{%- endcomment -%}
<div class="snippet-name">
{{ param }}
</div>
Snippet Parameters
Pass data to snippets via parameters:
{% render 'product-card',
product: product,
show_price: true,
image_size: 'large' %}
Why render Instead of include
renderis more performant- Better variable scoping
- Recommended by Shopify
Liquid Logic
Use {% liquid %} Tag
For long or complex logic, use the {% liquid %} tag:
{% liquid
assign discount = product.compare_at_price | minus: product.price
assign discount_percent = discount | times: 100 | divided_by: product.compare_at_price
if discount_percent > 20
assign is_big_discount = true
endif
%}
Logic Best Practices
- Avoid deeply nested conditionals
- Prefer readable, linear logic
- Break complex logic into multiple
liquidblocks if needed - Use meaningful variable names
Example: Clean Logic Flow
{% liquid
if product.available
assign button_text = 'Add to Cart'
assign button_class = 'btn--primary'
else
assign button_text = 'Sold Out'
assign button_class = 'btn--disabled'
endif
%}
<button class="{{ button_class }}">
{{ button_text }}
</button>
Images
Always Use image_tag
- Always use
image_tagfilter - Use responsive
srcsetand sizes - Do NOT hardcode
<img>tags - Use
<image_url>to generate a URL for an image. - Always specify either a width or height parameter for
<image_url>.
Image Tag Syntax
{{ image | image_url: width: image.width | image_tag: widths: '360, 720, 1080', loading: 'lazy' }}
Responsive Images
{% assign image_widths = '360, 540, 720, 900, 1080, 1296, 1512, 1728, 1944, 2160' %}
{{ product.featured_image | image_url: width: product.featured_image.width | image_tag:
widths: image_widths,
sizes: '(min-width: 1200px) 50vw, 100vw',
loading: 'lazy',
alt: product.featured_image.alt | escape }}
Image Settings
Common image_tag parameters:
widths: Comma-separated list of widths for srcsetsizes: Sizes attribute for responsive imagesloading: 'lazy' or 'eager'alt: Alt text (use| escapefilter)
SVG Files
Inline SVGs
Inline SVGs using the inline_asset_content filter:
{{ 'icon-arrow.svg' | inline_asset_content }}
Do NOT Paste Raw SVG
- Do NOT paste raw SVG markup into templates
- Store SVG files in
assets/directory - Use
inline_asset_contentfilter to include them
SVG Example
<button class="icon-button">
{{ 'icon-close.svg' | inline_asset_content }}
<span class="visually-hidden">Close</span>
</button>
SVG Styling
SVGs can be styled with CSS when inlined:
.icon-button svg {
width: 24px;
height: 24px;
fill: currentColor;
}
Shopify Theme Documentation
Reference these official Shopify resources:
- Liquid Documentation
- Liquid Objects
- Liquid Filters
- Liquid Tags
- Theme Templates
- Snippets
- Image Filters
Common Liquid Patterns
Product Card Snippet
{%- comment -%}
Usage:
{% render 'product-card', product: product, show_vendor: false %}
{%- endcomment -%}
<div class="product-card">
<a href="{{ product.url }}">
{{ product.featured_image | image_tag: widths: '360, 720', loading: 'lazy' }}
<h3>{{ product.title }}</h3>
<p>{{ product.price | money }}</p>
</a>
</div>
Conditional Rendering
{% liquid
if section.settings.show_title
assign title_visible = true
else
assign title_visible = false
endif
%}
{% if title_visible %}
<h2>{{ section.settings.title }}</h2>
{% endif %}
Instructions
- Use
renderfor snippets, neverinclude - Add Usage comments to all snippets
- Use
liquidtag for complex logic - Always use
image_tag- never hardcode<img> - Inline SVGs using
inline_asset_contentfilter - Keep logic linear - avoid deep nesting
- Use responsive images with proper srcset and sizes
More from niccos-shopify-workspace/shopify-cursor-skills
theme-shopify-css-guidelines
CSS naming conventions (BEM), nesting rules, and encapsulation guidelines for Shopify themes. Use when writing CSS for Shopify theme sections.
50theme-shopify-section-structure
Shopify theme section structure, file organization, and schema requirements. Use when creating or modifying Shopify theme sections.
49theme-shopify-javascript-standards
JavaScript standards for Shopify themes - custom elements, file structure, and best practices. Use when writing JavaScript for Shopify theme sections.
43app-shopify-admin-graphql
Execute Shopify Admin API calls via GraphQL in Shopify Remix apps. Use when querying or mutating Shopify data (customers, orders, products, shop, segments, subscriptions), when writing GraphQL for the Admin API, or when handling throttling and retries.
35theme-shopify-html-data-comments
HTML structure, data attributes, and commenting guidelines for Shopify themes. Use when structuring HTML markup and adding comments to Shopify theme code.
32app-shopify-polaris-web-components
Use Shopify Polaris Web Components (s-* custom elements) for App Home UI. Use when building App Home surfaces (not embedded apps), designing UI with s-page, s-section, s-stack, s-box, s-button, and other s-* components. Do not use @shopify/polaris React - App Home requires Web Components.
23