Shopify Flow 中的变量
变量是在工作流运行时替换为值的占位符。此类变量描述工作流中涉及的客户、订单和产品的属性。例如,订单号、订单价格、客户姓名等内容都有对应的变量。
Flow 使用不同于 Shopify 模板的 Liquid 版本,并且可以访问任何通过 GraphQL 后台 API 提供的变量。
大多数变量的名称都是自描述性的。例如,显示产品名称的变量是 {{ product.title }}
。发送消息时,此变量将替换为已订购产品的名称:Large Coffee Mug
。
向操作中添加变量
您可以将变量添加到包含添加变量链接的任何文本字段。点击相关字段下方的添加变量链接,然后从列表中选择变量。
添加变量列表中的变量将被筛选,以便您只看到适用于所选触发器的变量。从列表中选择变量后,该变量将被正确格式化并添加到文本框中。
Flow 支持几乎所有 GraphQL 后台 API 字段。
Liquid 变量
如果您是具有 Liquid 代码编写经验的开发人员,则可以使用 Liquid 编写变量或编辑您使用添加变量链接插入的变量。若要了解详细信息,请参阅 GraphQL 后台 API 参考。
条件和迭代标签
您可以手动将 Liquid 变量标签添加到工作流消息中。您可以使用这些标签在消息中包含更多信息。
例如,您可以使用 for loop
对象迭代对象列表,例如订单中的订单项目。借助这些标签,您可以创建包含详细信息(例如,订单中每个订单项目的产品标题、SKU、价格和数量)的消息,使接收者不必在 Shopify 后台查找这些信息。
Flow 支持以下 Liquid 条件(或控制流)标签:
- if
- unless
- elsif/else
- case/when
- and/or(多个条件)
Flow 还支持以下 Liquid 迭代标签:
筛选器
Flow 支持以下 Liquid 筛选条件:
筛选器名称 | 筛选器类型 |
---|---|
abs | 数学 |
append | 字符串 |
at_least | 数学 |
at_most | 数学 |
capitalize | 字符串 |
ceil | 数学 |
concat | 数组 |
date | 附加 |
default | 附加 |
divided_by | 数学 |
downcase | 字符串 |
escape | 字符串 |
首先 | 数组 |
floor | 数学 |
join | 数组 |
last | 数组 |
lstrip | 字符串 |
地图 | 数组 |
minus | 数学 |
modulo | 数学 |
newline_to_br | 字符串 |
Plus | 数学 |
prepend | 字符串 |
remove | 字符串 |
remove_first | 字符串 |
replace | 字符串 |
replace_first | 字符串 | reverse | 数组 |
round | 数学 |
rstrip | 字符串 |
尺寸 | 数组 |
slice | 字符串 |
排序 | 数组 |
split | 字符串 |
strip | 字符串 |
strip_html | 字符串 |
strip_newlines | 字符串 |
times | 数学 |
truncate | 字符串 |
truncatewords | 字符串 |
uniq | 数组 |
upcase | 字符串 |
url_encode | 字符串 |
where | 数组 |
变量示例
假设您想创建一个工作流,当客户某个订单的花费金额超过 500 美元时,该工作流会向员工发送电子邮件。您可以创建一个使用已创建订单触发器的工作流,设置在订单总额超过 500 美元时为 true 的条件,然后使用发送内部电子邮件操作。在发送内部电子邮件操作的消息部分中,您可以使用以下变量。
输入 | 输出 |
---|---|
{{ order.customer.firstName }} {{ order.customer.lastName }}({{ order.customer.email }}) 的下单金额为 {{ order.totalPriceSet.shopMoney.amount }} 美元,请向其发送私人感谢备注。 | Jeanne Dupont (jeanne@example.com) 的下单金额为 763.42 美元,请向其发送私人感谢备注。 |
您确定您需要在产品库存不足并且需要下订单以购买更多库存时通知员工。您可以创建一个通过库存数量已更改触发器启动的工作流,并设置在库存数量先验小于或等于 10 时为 true 的条件。在发送内部电子邮件操作的消息部分中,您可以使用以下变量。
输入 | 输出 |
---|---|
请重新订购 {{ product.title }}。向 owner@store.com 发送电子邮件以确认他们已收到采购订单。 | 请重新订购高腰打底裤 - 黑色。向 owner@example.com 发送电子邮件以确认他们已收到采购订单。 |
您希望取消具有高风险级别的订单,但倾向于让员工手动取消订单。您可以创建通过已创建订单触发器启动的工作流,并设置在订单风险级别等于“高”时为 true 的条件。在发送内部电子邮件操作的消息部分中,您可以使用以下变量。
输入 | 输出 |
---|---|
我们的 Shopify 商店收到一个具有高欺诈风险的订单。我们需要立即取消此订单,避免该订单进入处理流程: {{ order.name }} {{ order.billingAddress.lastName }}, {{ order.billingAddress.firstName }} {{ order.email }} 请确认新的订单状态。谢谢! |
我们的 Shopify 商店收到一个具有高欺诈风险的订单。我们需要立即取消此订单,避免该订单进入处理流程: #1001 Dupont, Jeanne jeanne@example.com 请确认新的订单状态。谢谢! |
for loop 示例
收到订单时,发送包含订购产品的消息非常有用。您可以使用 for loop
来实现此目的,它可重复执行代码块。支持变量的文本字段也支持 for loop 和 forloop 对象。
例如,您想创建一个工作流,用于返回订单中所有 SKU 和数量的列表。在发送内部电子邮件操作的消息部分中,您可以使用以下变量。
输入 | 输出 |
---|---|
订单摘要: {% for a in order.lineItems %} SKU: {{a.sku}} ({{a.quantity}}), {% endfor %} |
订单摘要: 8987097979 (50) 8877778887 (3) 888998898B (1) |
您决定要向电子邮件添加更多信息,包括产品名称、SKU、每件商品的价格以及客户的收货信息。在发送内部电子邮件操作的消息部分中,您可以使用以下变量。
输入 | 输出 |
---|---|
订单摘要: {% for a in order.lineItems %} 产品: {{a.title}} SKU: {{a.sku}} 价格(单价): {{a.originalUnitPriceSet.shopMoney.amount}} 美元 数量: {{a.quantity}} {% endfor %} |
订单摘要: 产品: 高腰打底裤 - 黑色 SKU: 8987097979 价格(单价): 8.49 美元 数量: 5 产品: 运动袜 - 蓝色 SKU: 888998898B 价格(单价): 5.61 美元 数量: 2 |
您需要跟踪由特定厂商供应的已售出商品。在发送内部电子邮件操作的消息部分中,您可以使用以下变量,并在您的 for loop
中包含 if
语句。
输入 | 输出 |
---|---|
Acme 产品已售出: {% for x in order.lineItems %} {% if x.vendor == 'acme-vendor' %} 产品名称: {{x.title}} SKU: {{x.sku}} {% endif %} {% endfor %} |
Acme 产品已售出: 产品名称: 高腰打底裤 - 黑色 SKU: 8987097979 |
Shopify Flow 中的复杂数据对象
Shopify Flow 不支持输出数组和对象,原因如下:
- GraphQL API 不建议输出不需要的数据,它可能会创建庞大的查询量,导致工作流程出现问题。
- 引入新功能会添加新的 API 字段,这可能会破坏您的工作流程。
如果自动发送过多数据,工作流程将会出问题。您应循环数组,并且仅包含您想要的字段,而不是直接调用数组和对象。
例如,您不应直接调用 {{ order.lineItems }}
,而是使用以下格式来调用某个字段。这些示例涵盖了直接调用数组或对象将会包含的所有字段。您可以复制并粘贴所需字段。
{% for li in order.lineItems %}
{% comment %}li.contract - omitted{% endcomment %}
{% for ca in li.customAttributes %}
{{ ca.key }}
{{ ca.value }}
{% endfor %}
{% for da in li.discountAllocations %}
{{ da.allocatedAmountSet.presentmentMoney.amount }}
{{ da.allocatedAmountSet.presentmentMoney.currencyCode }}
{{ da.allocatedAmountSet.shopMoney.amount }}
{{ da.allocatedAmountSet.shopMoney.currencyCode }}
{% endfor %}
{{ li.discountedTotalSet.presentmentMoney.amount }}
{{ li.discountedTotalSet.presentmentMoney.currencyCode }}
{{ li.discountedTotalSet.shopMoney.amount }}
{{ li.discountedTotalSet.shopMoney.currencyCode }}
{{ li.discountedUnitPriceSet.presentmentMoney.amount }}
{{ li.discountedUnitPriceSet.presentmentMoney.currencyCode }}
{{ li.discountedUnitPriceSet.shopMoney.amount }}
{{ li.discountedUnitPriceSet.shopMoney.currencyCode }}
{% comment %}li.duties - omitted {% endcomment %}
{{ li.fulfillableQuantity }}
{{ li.fulfillmentService.callbackUrl }}
{{ li.fulfillmentService.fulfillmentOrdersOptIn }}
{{ li.fulfillmentService.handle }}
{{ li.fulfillmentService.id }}
{{ li.fulfillmentService.inventoryManagement }}
{% comment %}rest of location omitted{% endcomment %}
{{ li.fulfillmentService.location.name }}
{{ li.fulfillmentService.productBased }}
{{ li.fulfillmentService.serviceName }}
{% for sm in li.fulfillmentService.shippingMethods %}
{{ sm.code }}
{{ sm.label }}
{% endfor %}
{{ li.fulfillmentService.type }}
{{ li.fulfillmentStatus }}
{{ li.id }}
{{ li.image.altText }}
{{ li.image.height }}
{{ li.image.id }}
{% comment %}li.image.metafield omitted{% endcomment %}
{% comment %}li.image.privateMetafield omitted{% endcomment %}
{{ li.image.width }}
{{ li.merchantEditable }}
{{ li.name }}
{{ li.nonFulfillableQuantity }}
{{ li.originalTotalSet.presentmentMoney.amount }}
{{ li.originalTotalSet.presentmentMoney.currencyCode }}
{{ li.originalTotalSet.shopMoney.amount }}
{{ li.originalTotalSet.shopMoney.currencyCode }}
{{ li.originalUnitPriceSet.presentmentMoney.amount }}
{{ li.originalUnitPriceSet.presentmentMoney.currencyCode }}
{{ li.originalUnitPriceSet.shopMoney.amount }}
{{ li.originalUnitPriceSet.shopMoney.currencyCode }}
{% comment %}rest of product omitted{% endcomment %}
{{ li.product.title }}
{{ li.quantity }}
{{ li.refundableQuantity }}
{{ li.requiresShipping }}
{{ li.restockable }}
{{ li.sellingPlan.name }}
{{ li.sku }}
{% for tl in li.taxLines %}
{{ tl.priceSet.presentmentMoney.amount | json }}
{{ tl.priceSet.presentmentMoney.currencyCode | json }}
{{ tl.priceSet.shopMoney.amount | json }}
{{ tl.priceSet.shopMoney.currencyCode | json }}
{{ tl.rate | json }}
{{ tl.ratePercentage | json }}
{{ tl.title | json }}
{% endfor %}
{{ li.taxable }}
{{ li.title }}
{{ li.totalDiscountSet.presentmentMoney.amount }}
{{ li.totalDiscountSet.presentmentMoney.currencyCode }}
{{ li.totalDiscountSet.shopMoney.amount }}
{{ li.totalDiscountSet.shopMoney.currencyCode }}
{{ li.unfulfilledDiscountedTotalSet.presentmentMoney.amount }}
{{ li.unfulfilledDiscountedTotalSet.presentmentMoney.currencyCode }}
{{ li.unfulfilledDiscountedTotalSet.shopMoney.amount }}
{{ li.unfulfilledDiscountedTotalSet.shopMoney.currencyCode }}
{{ li.unfulfilledOriginalTotalSet.presentmentMoney.amount }}
{{ li.unfulfilledOriginalTotalSet.presentmentMoney.currencyCode }}
{{ li.unfulfilledOriginalTotalSet.shopMoney.amount }}
{{ li.unfulfilledOriginalTotalSet.shopMoney.currencyCode }}
{{ li.unfulfilledQuantity }}
{% comment %}rest of variant omitted{% endcomment %}
{{ li.variant.title }}
{{ li.variantTitle }}
{{ li.vendor }}
{% endfor %}
{
"lineItems": [
{% for li in order.lineItems %}
{% if forloop.first != true %},{% endif %}
{
"contract": {
{% comment %}rest of contract omitted{% endcomment %}
"id": {{ li.contract.id | json }}
},
"customAttributes": [
{% for ca in li.customAttributes %}
{% if forloop.first != true %},{% endif %}
{
"key":{{ ca.key | json }},
"value":{{ ca.value | json }}
}
{% endfor %}
],
"discountAllocations": [
{% for da in li.discountAllocations %}
{% if forloop.first != true %},{% endif %}
"allocatedAmountSet": {
"presentmentMoney" : {
"amount": {{ da.allocatedAmountSet.presentmentMoney.amount | json }},
"currencyCode": {{ da.allocatedAmountSet.presentmentMoney.currencyCode | json }}
},
"shopMoney": {
"amount": {{ da.allocatedAmountSet.shopMoney.amount | json }},
"currencyCode": {{ da.allocatedAmountSet.shopMoney.currencyCode | json }}
}
}
{% endfor %}
],
"discountedTotalSet": {
"presentmentMoney" : {
"amount": {{ li.discountedTotalSet.presentmentMoney.amount | json }},
"currencyCode": {{ li.discountedTotalSet.presentmentMoney.currencyCode | json }}
},
"shopMoney": {
"amount": {{ li.discountedTotalSet.shopMoney.amount | json }},
"currencyCode": {{ li.discountedTotalSet.shopMoney.currencyCode | json }}
}
},
"discountedUnitPriceSet": {
"presentmentMoney" : {
"amount": {{ li.discountedUnitPriceSet.presentmentMoney.amount | json }},
"currencyCode": {{ li.discountedUnitPriceSet.presentmentMoney.currencyCode | json }}
},
"shopMoney": {
"amount": {{ li.discountedUnitPriceSet.shopMoney.amount | json }},
"currencyCode": {{ li.discountedUnitPriceSet.shopMoney.currencyCode | json }}
}
},
"duties": [
{% for duty li.duties %}
{% if forloop.first != true %},{% endif %}
{
{% comment %}rest of duties omitted{% endcomment %}
"id": {{ duty.id | json }}
}
{% endfor %}
],
"fulfillableQuantity": {{ li.fulfillableQuantity | json }},
"fulfillmentService": {
"callbackUrl":{{ li.fulfillmentService.callbackUrl | json }},
"fulfillmentOrdersOptIn": {{ li.fulfillmentService.fulfillmentOrdersOptIn | json }},
"handle": {{ li.fulfillmentService.handle | json }},
"id": {{ li.fulfillmentService.id | json }},
"inventoryManagement": {{ li.fulfillmentService.inventoryManagement | json }},
{% comment %}fulfillmentService.inventoryManagement - omitted {% endcomment %}
"productBased": {{ li.fulfillmentService.productBased | json }},
"serviceName": {{ li.fulfillmentService.serviceName | json }},
"shippingMethods": [
{% for sm in li.fulfillmentService.shippingMethods %}
{% if forloop.first != true %},{% endif %}
{
"code": {{ sm.code | json }},
"label": {{ sm.label | json }}
}
{% endfor %}
],
"type": {{ li.fulfillmentService.type | json }}
},
"fulfillmentStatus": {{ li.fulfillmentStatus | json }},
"id": {{ li.id | json }},
"image": {
"altText": {{ li.image.altText | json }},
"height": {{ li.image.height | json }},
"id": {{ li.image.id | json }},
{% comment %}li.image.metafield omitted{% endcomment %}
{% comment %}li.image.privateMetafield omitted{% endcomment %}
"width":{{ li.image.width | json }}
},
"merchantEditable": {{ li.merchantEditable | json }},
"name": {{ li.name | json }},
"nonFulfillableQuantity": {{ li.nonFulfillableQuantity | json }},
"originalTotalSet": {
"presentmentMoney" : {
"amount": {{ li.originalTotalSet.presentmentMoney.amount | json }},
"currencyCode": {{ li.originalTotalSet.presentmentMoney.currencyCode | json }}
},
"shopMoney": {
"amount": {{ li.originalTotalSet.shopMoney.amount | json }},
"currencyCode": {{ li.originalTotalSet.shopMoney.currencyCode | json }}
}
},
"originalUnitPriceSet": {
"presentmentMoney" : {
"amount": {{ li.originalUnitPriceSet.presentmentMoney.amount | json }},
"currencyCode": {{ li.originalUnitPriceSet.presentmentMoney.currencyCode | json }}
},
"shopMoney": {
"amount": {{ li.originalUnitPriceSet.shopMoney.amount | json }},
"currencyCode": {{ li.originalUnitPriceSet.shopMoney.currencyCode | json }}
}
},
"product": {
{% comment %}rest of Product omitted{% endcomment %}
"title": {{ li.product.title | json }}
},
"quantity": {{ li.quantity | json }},
"refundableQuantity": {{ li.refundableQuantity | json }},
"requiresShipping": {{ li.requiresShipping | json }},
"restockable": {{ li.restockable | json }},
"sellingPlan": {
"name": {{ li.sellingPlan.name | json }}
},
"sku": {{ li.sku | json }},
"taxLines": [
{% for tl in li.taxLines %}
{% if forloop.first != true %},{% endif %}
{
"priceSet": {
"presentmentMoney" : {
"amount": {{ tl.priceSet.presentmentMoney.amount | json }},
"currencyCode": {{ tl.priceSet.presentmentMoney.currencyCode | json }}
},
"shopMoney": {
"amount": {{ tl.priceSet.shopMoney.amount | json }},
"currencyCode": {{ tl.priceSet.shopMoney.currencyCode | json }}
}
},
"rate": {{ tl.rate | json }},
"ratePercentage": {{ tl.ratePercentage | json }},
"title": {{ tl.title | json }}
}
{% endfor %}
],
"taxable":{{ li.taxable | json }},
"title":{{ li.title | json }},
"totalDiscountSet": {
"presentmentMoney" : {
"amount": {{ li.totalDiscountSet.presentmentMoney.amount | json }},
"currencyCode": {{ li.totalDiscountSet.presentmentMoney.currencyCode | json }}
},
"shopMoney": {
"amount": {{ li.totalDiscountSet.shopMoney.amount | json }},
"currencyCode": {{ li.totalDiscountSet.shopMoney.currencyCode | json }}
}
},
"unfulfilledDiscountedTotalSet": {
"presentmentMoney" : {
"amount": {{ li.unfulfilledDiscountedTotalSet.presentmentMoney.amount | json }},
"currencyCode": {{ li.unfulfilledDiscountedTotalSet.presentmentMoney.currencyCode | json }}
},
"shopMoney": {
"amount": {{ li.unfulfilledDiscountedTotalSet.shopMoney.amount | json }},
"currencyCode": {{ li.unfulfilledDiscountedTotalSet.shopMoney.currencyCode | json }}
}
},
"unfulfilledOriginalTotalSet": {
"presentmentMoney" : {
"amount": {{ li.unfulfilledOriginalTotalSet.presentmentMoney.amount | json }},
"currencyCode": {{ li.unfulfilledOriginalTotalSet.presentmentMoney.currencyCode | json }}
},
"shopMoney": {
"amount": {{ li.unfulfilledOriginalTotalSet.shopMoney.amount | json }},
"currencyCode": {{ li.unfulfilledOriginalTotalSet.shopMoney.currencyCode | json }}
}
},
"unfulfilledQuantity": {{ li.unfulfilledQuantity | json }},
"variant": {
{% comment %}rest of variant omitted {% endcomment %}
"title": {{ li.variant.title | json }}
},
"variantTitle": {{ li.variantTitle | json }},
"vendor": {{ li.vendor | json }}
}
{% endfor %}
]
}