Skip to Content
🎉 探索 Shopify 的无限可能 结构化知识 + 实战案例,持续更新中...
Liquid 开发Liquid 过滤器

5--- title: “过滤器完全指南” description: “全面掌握Shopify Liquid过滤器,包含所有过滤器的详细说明和实际代码示例”

过滤器完全指南

过滤器是 Liquid 模板语言的核心功能之一,用于修改对象的输出。本指南将详细介绍所有可用的 Shopify Liquid 过滤器,并提供实际的代码示例。

过滤器基础

基本语法

{{ object | filter_name }} {{ object | filter_name: parameter }} {{ object | filter_name: parameter1, parameter2 }}

链式过滤器

{{ product.title | downcase | replace: ' ', '-' | append: '.html' }}

字符串过滤器

文本转换

upcase - 转换为大写

{{ 'hello world' | upcase }} <!-- 输出: HELLO WORLD --> {{ product.title | upcase }} <!-- 输出产品标题的大写形式 -->

downcase - 转换为小写

{{ 'HELLO WORLD' | downcase }} <!-- 输出: hello world --> {{ customer.email | downcase }} <!-- 确保邮箱地址为小写 -->

capitalize - 首字母大写

{{ 'hello world' | capitalize }} <!-- 输出: Hello world --> {{ customer.first_name | capitalize }} <!-- 客户名字首字母大写 -->

strip - 移除首尾空格

{{ ' hello world ' | strip }} <!-- 输出: hello world -->

文本处理

truncate - 截断文本

{{ product.description | truncate: 100 }} <!-- 截断到100个字符 --> {{ product.description | truncate: 100, '...' }} <!-- 自定义截断标记 --> {{ article.content | strip_html | truncate: 150 }} <!-- 先移除HTML再截断 -->

strip_html - 移除HTML标签

{{ product.description | strip_html }} <!-- 移除所有HTML标签 --> {{ article.content | strip_html | truncate: 200 }} <!-- 移除HTML标签后截断 -->

strip_newlines - 移除换行符

{{ product.description | strip_newlines }} <!-- 移除所有换行符 -->

newline_to_br - 换行符转换为<br />

{{ product.description | newline_to_br }} <!-- 将\n转换为<br>标签 -->

字符串操作

replace - 替换文本

{{ product.title | replace: 'iPhone', 'Apple iPhone' }} <!-- 替换指定文本 --> {{ product.handle | replace: '-', ' ' | capitalize }} <!-- 将连字符替换为空格并首字母大写 -->

remove - 移除文本

{{ product.title | remove: 'Brand:' }} <!-- 移除指定文本 --> {{ product.tags | join: ', ' | remove: 'hidden' }} <!-- 从标签列表中移除特定标签 -->

append - 添加到末尾

{{ product.title | append: ' - 限时特价' }} <!-- 在标题末尾添加文本 --> {{ product.url | append: '?utm_source=newsletter' }} <!-- 在URL后添加参数 -->

prepend - 添加到开头

{{ product.title | prepend: '热销商品: ' }} <!-- 在标题开头添加文本 -->

split - 分割字符串

{{ product.tags | split: ',' }} <!-- 将标签字符串分割为数组 -->

URL和编码

url_encode - URL编码

{{ product.title | url_encode }} <!-- URL编码产品标题 --> {{ search.terms | url_encode }} <!-- 编码搜索词 -->

url_decode - URL解码

{{ encoded_text | url_decode }} <!-- URL解码 -->

escape - HTML转义

{{ product.description | escape }} <!-- 转义HTML特殊字符 --> {{ customer.note | escape }} <!-- 安全显示用户输入内容 -->

escape_once - HTML转义(只转义一次)

{{ content | escape_once }} <!-- 避免重复转义 -->

数字过滤器

金额格式化

money - 格式化为货币

{{ product.price | money }} <!-- 输出: ¥99.00 --> {{ cart.total_price | money }} <!-- 购物车总价格式化 -->

money_without_currency - 不显示货币符号

{{ product.price | money_without_currency }} <!-- 输出: 99.00 -->

money_with_currency - 显示货币代码

{{ product.price | money_with_currency }} <!-- 输出: ¥99.00 CNY -->

数学运算

plus - 加法

{{ product.price | plus: 10 }} <!-- 价格加10 --> {{ cart.item_count | plus: 1 }} <!-- 购物车数量加1 -->

minus - 减法

{{ product.compare_at_price | minus: product.price }} <!-- 计算折扣金额 -->

times - 乘法

{{ product.price | times: 0.9 }} <!-- 9折价格 --> {{ item.quantity | times: item.price }} <!-- 计算总价 -->

divided_by - 除法

{{ product.price | divided_by: 2 }} <!-- 价格除以2 --> {{ total_savings | divided_by: original_price | times: 100 }} <!-- 计算折扣百分比 -->

modulo - 取余

{{ forloop.index | modulo: 2 }} <!-- 判断奇偶数 -->

数字格式化

round - 四舍五入

{{ 4.6 | round }} <!-- 输出: 5 --> {{ product.price | divided_by: 3 | round: 2 }} <!-- 保留两位小数 -->

ceil - 向上取整

{{ 4.2 | ceil }} <!-- 输出: 5 -->

floor - 向下取整

{{ 4.8 | floor }} <!-- 输出: 4 -->

abs - 绝对值

{{ -5 | abs }} <!-- 输出: 5 -->

日期过滤器

date - 日期格式化

<!-- 基本格式 --> {{ article.published_at | date: '%Y-%m-%d' }} <!-- 输出: 2023-12-01 --> {{ article.published_at | date: '%B %d, %Y' }} <!-- 输出: December 01, 2023 --> <!-- 中文格式 --> {{ article.published_at | date: '%Y年%m月%d日' }} <!-- 输出: 2023年12月01日 --> {{ article.published_at | date: '%m月%d日 %H:%M' }} <!-- 输出: 12月01日 14:30 --> <!-- 完整示例 --> {{ order.created_at | date: '%Y年%m月%d日 %H:%M:%S' }} <!-- 订单创建时间 --> {{ customer.created_at | date: '%Y年%m月' }} <!-- 客户注册月份 -->

常用日期格式

<!-- 完整日期时间 --> {{ 'now' | date: '%Y-%m-%d %H:%M:%S' }} <!-- 短日期 --> {{ 'now' | date: '%m/%d/%Y' }} <!-- 长日期 --> {{ 'now' | date: '%A, %B %d, %Y' }} <!-- 时间戳 --> {{ 'now' | date: '%s' }} <!-- ISO 8601 格式 --> {{ 'now' | date: '%Y-%m-%dT%H:%M:%S%z' }}

数组过滤器

数组信息

size - 获取数组长度

{{ collection.products | size }} <!-- 集合中产品数量 --> {{ cart.items | size }} <!-- 购物车商品种类数 --> {{ product.tags | size }} <!-- 产品标签数量 -->

first - 获取第一个元素

{{ collection.products | first }} <!-- 第一个产品 --> {{ product.images | first | img_url: '300x300' }} <!-- 第一张产品图片 -->

last - 获取最后一个元素

{{ collection.products | last }} <!-- 最后一个产品 --> {{ blog.articles | last }} <!-- 最新文章 -->

数组操作

join - 连接数组元素

{{ product.tags | join: ', ' }} <!-- 用逗号连接标签 --> {{ breadcrumb | join: ' > ' }} <!-- 面包屑导航 -->

split - 分割字符串为数组

{{ 'red,green,blue' | split: ',' }} <!-- 分割为颜色数组 --> {{ product.tags | split: ',' | join: ' | ' }} <!-- 重新格式化标签 -->

reverse - 反转数组

{% assign products = collection.products | reverse %} {% for product in products %} <!-- 从最新到最旧显示产品 --> {% endfor %}

sort - 排序数组

{{ product.tags | sort }} <!-- 按字母顺序排序标签 --> {% assign sorted_products = collection.products | sort: 'price' %} <!-- 按价格排序产品 -->

sort_natural - 自然排序

{{ product.tags | sort_natural }} <!-- 自然排序(数字按数值排序) -->

uniq - 去重

{{ all_tags | uniq }} <!-- 移除重复标签 -->

数组筛选

where - 筛选数组

{% assign available_products = collection.products | where: 'available', true %} <!-- 筛选有库存的产品 --> {% assign featured_articles = blog.articles | where: 'tags', 'featured' %} <!-- 筛选特色文章 -->

map - 提取属性

{{ collection.products | map: 'title' }} <!-- 提取所有产品标题 --> {{ cart.items | map: 'product.vendor' | uniq %} <!-- 获取购物车中所有供应商 -->

图片过滤器

img_url - 生成图片URL

<!-- 指定尺寸 --> {{ product.featured_image | img_url: '300x300' }} <!-- 300x300 像素 --> {{ product.featured_image | img_url: '500x' }} <!-- 宽度500像素,高度自适应 --> {{ product.featured_image | img_url: 'x400' }} <!-- 高度400像素,宽度自适应 --> <!-- 预设尺寸 --> {{ product.featured_image | img_url: 'master' }} {{ product.featured_image | img_url: 'grande' }} {{ product.featured_image | img_url: 'large' }} {{ product.featured_image | img_url: 'medium' }} {{ product.featured_image | img_url: 'compact' }} {{ product.featured_image | img_url: 'small' }} {{ product.featured_image | img_url: 'thumb' }} {{ product.featured_image | img_url: 'icon' }} <!-- 响应式图片 --> <img src="{{ product.featured_image | img_url: '300x300' }}" srcset="{{ product.featured_image | img_url: '300x300' }} 1x, {{ product.featured_image | img_url: '600x600' }} 2x" alt="{{ product.featured_image.alt | escape }}">

img_tag - 生成img标签

{{ product.featured_image | img_tag: '300x300', alt: product.title }} <!-- 生成完整的img标签 --> {{ article.image | img_tag: 'large', class: 'article-image', loading: 'lazy' }} <!-- 带CSS类和懒加载 -->

颜色过滤器

color_to_rgb - 转换为RGB

{{ '#ff0000' | color_to_rgb }} <!-- 输出: rgb(255, 0, 0) -->

color_to_hsl - 转换为HSL

{{ '#ff0000' | color_to_hsl }} <!-- 输出: hsl(0, 100%, 50%) -->

color_to_hex - 转换为HEX

{{ 'rgb(255, 0, 0)' | color_to_hex }} <!-- 输出: #ff0000 -->

color_brightness - 获取亮度

{{ '#ffffff' | color_brightness }} <!-- 输出亮度值 -->

color_lighten - 调亮颜色

{{ '#ff0000' | color_lighten: 20 }} <!-- 将红色调亮20% -->

color_darken - 调暗颜色

{{ '#ff0000' | color_darken: 20 }} <!-- 将红色调暗20% -->

实际应用示例

产品卡片完整示例

<!-- snippets/product-card.liquid --> <div class="product-card" data-product-id="{{ product.id }}"> <!-- 产品图片 --> <div class="product-image"> <a href="{{ product.url }}"> {% if product.featured_image %} <img src="{{ product.featured_image | img_url: '300x300' }}" srcset="{{ product.featured_image | img_url: '300x300' }} 1x, {{ product.featured_image | img_url: '600x600' }} 2x" alt="{{ product.featured_image.alt | escape | default: product.title }}" loading="lazy"> {% else %} <div class="no-image">暂无图片</div> {% endif %} </a> <!-- 促销标签 --> {% if product.compare_at_price > product.price %} {% assign discount = product.compare_at_price | minus: product.price %} {% assign discount_percent = discount | times: 100 | divided_by: product.compare_at_price | round %} <span class="sale-badge">-{{ discount_percent }}%</span> {% endif %} </div> <!-- 产品信息 --> <div class="product-info"> <!-- 供应商 --> {% if product.vendor != blank %} <div class="product-vendor">{{ product.vendor | upcase }}</div> {% endif %} <!-- 产品标题 --> <h3 class="product-title"> <a href="{{ product.url }}"> {{ product.title | truncate: 60 }} </a> </h3> <!-- 产品价格 --> <div class="product-price"> {% if product.compare_at_price > product.price %} <span class="price-compare">{{ product.compare_at_price | money }}</span> <span class="price-sale">{{ product.price | money }}</span> {% else %} <span class="price">{{ product.price | money }}</span> {% endif %} </div> <!-- 产品标签 --> {% if product.tags.size > 0 %} <div class="product-tags"> {% assign display_tags = product.tags | where_not: 'hidden' | slice: 0, 3 %} {% for tag in display_tags %} <span class="tag">{{ tag | replace: '_', ' ' | capitalize }}</span> {% endfor %} </div> {% endif %} <!-- 变体信息 --> {% if product.variants.size > 1 %} <div class="variant-info"> {{ product.variants.size }} 个选项可选 </div> {% endif %} </div> </div>

购物车摘要示例

<!-- snippets/cart-summary.liquid --> <div class="cart-summary"> <!-- 购物车商品数量 --> <div class="cart-count"> 购物车 ({{ cart.item_count }} {% if cart.item_count == 1 %}件商品{% else %}件商品{% endif %}) </div> <!-- 商品列表 --> {% for item in cart.items limit: 5 %} <div class="cart-item-summary"> <img src="{{ item.image | img_url: '60x60' }}" alt="{{ item.title | escape }}"> <div class="item-details"> <div class="item-title">{{ item.product.title | truncate: 30 }}</div> {% unless item.variant.title contains 'Default' %} <div class="item-variant">{{ item.variant.title }}</div> {% endunless %} <div class="item-quantity-price"> {{ item.quantity }} × {{ item.price | money }} </div> </div> </div> {% endfor %} <!-- 显示更多 --> {% if cart.item_count > 5 %} <div class="more-items"> 还有 {{ cart.item_count | minus: 5 }} 件商品... </div> {% endif %} <!-- 总计 --> <div class="cart-total"> <div class="subtotal"> 小计: {{ cart.total_price | money }} </div> {% if cart.total_discounts > 0 %} <div class="discounts"> 折扣: -{{ cart.total_discounts | money }} </div> {% endif %} </div> </div>

博客文章预览

<!-- snippets/article-preview.liquid --> <article class="article-preview"> <!-- 文章图片 --> {% if article.image %} <div class="article-image"> <a href="{{ article.url }}"> <img src="{{ article.image | img_url: '400x250' }}" alt="{{ article.image.alt | escape | default: article.title }}" loading="lazy"> </a> </div> {% endif %} <!-- 文章内容 --> <div class="article-content"> <!-- 文章标题 --> <h2 class="article-title"> <a href="{{ article.url }}">{{ article.title }}</a> </h2> <!-- 文章元信息 --> <div class="article-meta"> <time datetime="{{ article.published_at | date: '%Y-%m-%d' }}"> {{ article.published_at | date: '%Y年%m月%d日' }} </time> {% if article.author != blank %} <span class="author">作者: {{ article.author }}</span> {% endif %} {% if article.tags.size > 0 %} <div class="tags"> {% for tag in article.tags limit: 3 %} <span class="tag">{{ tag | replace: '_', ' ' | capitalize }}</span> {% endfor %} </div> {% endif %} </div> <!-- 文章摘要 --> <div class="article-excerpt"> {% if article.excerpt != blank %} {{ article.excerpt | strip_html | truncate: 200 }} {% else %} {{ article.content | strip_html | truncate: 200 }} {% endif %} </div> <!-- 阅读时间估算 --> {% assign reading_time = article.content | strip_html | split: ' ' | size | divided_by: 200 | at_least: 1 %} <div class="reading-time"> 预计阅读时间: {{ reading_time }} 分钟 </div> <a href="{{ article.url }}" class="read-more">阅读全文</a> </div> </article>

过滤器最佳实践

1. 性能考虑

<!-- 好的做法:在循环外处理数据 --> {% assign featured_products = collection.products | where: 'tags', 'featured' %} {% for product in featured_products %} <!-- 渲染产品 --> {% endfor %} <!-- 避免:在循环内重复处理 --> {% for product in collection.products %} {% if product.tags contains 'featured' %} <!-- 渲染产品 --> {% endif %} {% endfor %}

2. 安全性

<!-- 始终转义用户输入 --> {{ customer.note | escape }} {{ search.terms | escape }} <!-- 处理可能为空的值 --> {{ product.featured_image.alt | escape | default: product.title }}

3. 可读性

<!-- 使用变量提高可读性 --> {% assign discount_percent = product.compare_at_price | minus: product.price | times: 100 | divided_by: product.compare_at_price | round %} <!-- 而不是一行完成所有计算 --> {{ product.compare_at_price | minus: product.price | times: 100 | divided_by: product.compare_at_price | round }}%

相关资源

掌握这些过滤器将让您能够创建强大而灵活的 Shopify 主题!

最后更新时间: