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 主题!
最后更新时间: