Variables de Liquid en Shopify Flow

Las variables son marcadores de posición que se reemplazan por valores cuando se ejecuta un flujo de trabajo. Estas variables describen los atributos de los clientes, pedidos y productos que están involucrados en tus flujos de trabajo. Por ejemplo, hay variables para el número de pedido, el precio del pedido, el nombre del cliente, entre otros. Las variables pueden usarse en condiciones para controlar la lógica en tu flujo de trabajo o para generar datos en una acción.

Acerca de Liquid

Liquid es un lenguaje de plantilla que se usa para acceder a variables en acciones y para escribir código en Flow. Flow usa una variante de Liquid que sigue de cerca la biblioteca de código abierto. Los temas de Shopify usan otra variante de Liquid que es específica para los temas e incluye muchos más filtros y etiquetas que los que admite Flow, así como una sintaxis diferente para acceder a las variables.

Variables de Liquid

Puedes agregar variables de Liquid a cualquier campo de texto que contenga el enlace Agregar variable. Haz clic en el enlace Agregar variable debajo del campo correspondiente y luego selecciona una variable de la lista.

imagen que muestra qué campos aceptan liquid

Las variables en la lista Agregar una variable se filtran, de modo que solo ves que las variables regresan por pasos antes del paso actual, como los activadores. Por ejemplo, el activador Pedido creado proporciona recursos de los pedidos y de la tienda, lo que luego te permite usar cualquier variable relacionada con el pedido o la configuración de la tienda que esté disponibles en la GraphQL Admin API. Después de elegir una variable de la lista, se le da el formato correcto y se agrega al cuadro de texto por ti.

También puedes escribir el liquid directamente en el bloque de texto. Por ejemplo, puedes usar la variable {{ order.name }} para mostrar la cadena de pedido que se muestra en el panel de control de Shopify, como el pedido-123.

Como Flow usa la GraphQL Admin API para recuperar los datos que usas en Liquid, la sintaxis de variables usa combinación de mayúsculas y minúsculas, estilo "camel case". Por ejemplo, para acceder a la fecha en que se creó un producto, introduce {{ product.createdAt }}. Si usas la sintaxis de Liquid en un tema de Shopify, introduciríamos {{ product.created_at }}.

Etiquetas condicionales y de iteración de Liquid

Quizás deseas usar etiquetas Liquid para hacer cosas como:

  • Escribir declaraciones condicionales, como determinar si el total de un pedido es mayor que $100
  • Iterar a través de una lista de objetos, como generar datos para cada línea de artículo en un pedido

Puedes usar etiquetas de Liquid para escribir estas declaraciones e iterar objetos.

Por ejemplo, en el siguiente Liquid se muestra el número de pedido si el total es mayor que $100:

{% if order.totalPriceSet.shopMoney.amount > 100 %}
  Order number: {{ order.name }}
{% endif %}

También puedes usar un bucle "for" para iterar en una lista de objetos, como líneas de artículo para un pedido. Por ejemplo, en el siguiente Liquid se muestra el nombre de cada línea de artículo de un pedido:

{% for li in order.lineItems %}
  {{ li.title }}
{% endfor %}

Flow admite las siguientes etiquetas condicionales (o de flujo de control) de Liquid:

Flow también admite las siguientes etiquetas de iteración Liquid:

Filtros

Los filtros te permiten transformar datos en Liquid. Flow es compatible con todos los filtros de código abierto de Liquid.

Por ejemplo, el siguiente Liquid elimina un prefijo del nombre del pedido y genera lo que queda: {{ order.name | remove: "Order-" }}

Además de los filtros estándar de Liquid, Flow proporciona filtros de fecha para obtener una fecha relativa a otra fecha para admitir el activador de hora programada y activar funciones de obtención de datos. Estos filtros son: date_minus y date_plus.

Para devolver una fecha un día después:{{ "now" | date_plus: "1 day" }}

Para devolver una fecha un día en el pasado:{{ "now" | date_minus: "1 day" }}

Estos filtros aceptan second, minute, day, week, monthy year como la unidad de duración, tanto singular (como second) y plural (como seconds). Además de este formato, también puedes suministrar un número entero (número de segundos). Por ejemplo:{{ "now" | date_minus: 3600 }}

También puedes suministrar una cadena de duración ISO8601, en la que P1Y2D significa 1 año y 2 días:{{ "now" | date_minus: "P1Y2D" }}

Consideraciones para usar variables de Liquid en filtros

  • Flow no admite la notación de puntos que está disponible para algunos filtros. Por ejemplo, Flow admite {{ order.lineItems | size }} pero no {{ order.lineItems.size }}.
  • Flow no admite la notación de puntos para metacampos. Por ejemplo, no puedes usar {{ order.metafields.custom.hold_note }}. En su lugar, debes hacer un bucle sobre los metacampos como se describe en los ejemplos.
  • Flow no admite el uso de menús para acceder a los artículos de una lista. Por ejemplo, no puedes usar {{ order.lineItems[0].title }}. En su lugar, debes hacer un bucle sobre las líneas de artículos como se describe en los ejemplos.

Ejemplos

Para tener una mejor idea de cómo usar las variables de Liquid, ten en cuenta los siguientes ejemplos.

Extraer URL para recursos

Es preciso extraer las URL del cliente, el pedido y el producto que están involucrados en un flujo de trabajo.

# Output the base Admin URL for your store
https://admin.shopify.com/store/{{ shop.myShopifyDomain | replace: ".myshopify.com", "" }}

# Assign the base Admin url to a variable named base_url:
{%- capture base_url -%}https://admin.shopify.com/store/{{ shop.myShopifyDomain | replace: ".myshopify.com", "" }}{%- endcapture -%}

# Customer from a Customer trigger:
{{ base_url }}/customers/{{ customer.legacyResourceId }}

# Customer without the base_url:
https://admin.shopify.com/store/{{ shop.myShopifyDomain | replace: ".myshopify.com", "" }}/customers/{{ customer.legacyResourceId }}

# Customer from an Order trigger:
{{ base_url }}/customers/{{ order.customer.legacyResourceId }}

# Order:
{{ base_url }}/orders/{{ order.legacyResourceId }}

# Product:
{{ base_url }}/products/{{ product.legacyResourceId }}

# Product Variant:
{{ base_url }}/products/{{ product.legacyResourceId }}/variants/{{ productVariant.legacyResourceId }}

# Example showing a clickable link in HTML, making use of the URL:
<a href="{{ base_url }}/products/{{ product.legacyResourceId }}">{{ product.title }}</a>

Convertir una lista de etiquetas en un metacampo

Deseas convertir un conjunto de etiquetas en un metacampo que es una lista de campos de texto de una sola línea. Creas un flujo de trabajo con el activador Producto agregado a la tienda y usas la acción Actualizar metacampo del producto. En la sección Valor de la acción Actualizar metacampo del producto, agregas el siguiente código de Liquid. Este ejemplo supone que solo debes establecer los valores una vez cuando se crea el producto y que este tiene dos etiquetas relevantes: color:red y color:orange.

Ejemplo de Liquid para establecer la lista de un campo de texto de una sola línea.
EntradaSalida
{% capture mf_value %}
{%- for tags_item in product.tags -%}
{%- if tags_item contains "color:" -%}
"{{- tags_item | remove_first: "color:" | strip -}}",
{%- endif -%}
{%- endfor -%}
{% endcapture -%}
[{{mf_value | remove_last: ","}}]
["rojo", "naranja"]

Escribir un mensaje de correo electrónico dinámico para un pedido

Deseas crear un flujo de trabajo para enviar un correo electrónico a un empleado cuando un cliente gaste más de $500 en un pedido. Creas un flujo de trabajo con el activador Pedido creado, estableces una condición que sea verdadera si el total del pedido es superior a $500 y usas la acción Enviar correo electrónico interno. En la sección Mensaje de la acción Enviar correo electrónico interno, usas las siguientes variables.

Ejemplo del uso de variables para proporcionar detalles del cliente
EntradaSalida
Envía una nota de agradecimiento personal a {{ order.customer.firstName }} {{ order.customer.lastName }}({{ order.customer.email }}) por realizar un pedido de $ {{ order.totalPriceSet.shopMoney.amount }}.Envía una nota de agradecimiento personal a Jeanne Dupont (jeanne@example.com) por realizar un pedido de $ 763,42.

Escribir un mensaje de correo electrónico dinámico para un producto con pocas existencias

Decides que es necesario informar a un empleado cuando el inventario de productos esté bajando y sea necesario realizar un pedido para ampliar las existencias. Creas un flujo de trabajo que se inicia con el activador Cantidad de inventario cambiada y estableces una condición que sea verdadera si la cantidad de inventario anterior es inferior o igual a 10. En la sección Mensaje de la acción Enviar correo electrónico interno, usas las siguientes variables.

Ejemplo del uso de variables para proporcionar detalles del artículo.
EntradaSalida
Solicita de nuevo {{ product.title }}. Envía a owner@store.com un correo electrónico para verificar que ha recibido la orden de compra.Solicita de nuevo los leggings de cintura alta negros. Envía a owner@example.com un correo electrónico para verificar que ha recibido la orden de compra.

Escribir un mensaje de correo electrónico dinámico para informar a los empleados sobre un pedido fraudulento

Deseas cancelar los pedidos que tengan un nivel de riesgo alto, pero prefieres que tus empleados cancelen el pedido manualmente. Creas un flujo de trabajo que se inicia con el activador Pedido creado y estableces una condición que sea verdadera si el nivel de riesgo del pedido es elevado. En la sección Mensaje de la acción Enviar correo electrónico interno, usas las siguientes variables.

Ejemplo del uso de variables para proporcionar información sobre un pedido fraudulento
EntradaSalida
Nuestra tienda Shopify ha recibido un pedido con un alto riesgo de fraude. Nos gustaría cancelar este pedido de inmediato, antes de enviarlo a producción:

{{ order.name }}
{{ order.billingAddress.lastName }}, {{ order.billingAddress.firstName }}
{{ order.email }}

Confirma el nuevo estado del pedido. ¡Gracias!
Nuestra tienda Shopify ha recibido un pedido con un alto riesgo de fraude. Nos gustaría cancelar este pedido de inmediato, antes de enviarlo a producción:

#1001
Dupont, Jeanne
jeanne@example.com

Confirma el nuevo estado del pedido. ¡Gracias!

Extraer las líneas de artículo de un pedido usando un bucle for

Cuando se recibe un pedido, puede ser útil enviar un mensaje que contenga los productos solicitados. Puedes hacer esto usando for loop, que ejecuta repetidamente un bloque de código. Los campos de texto que admiten variables también admiten bucles "for" y el objeto "forloop".

Por ejemplo, deseas crear un flujo de trabajo que devuelva una lista de todos los SKU y cantidades de un pedido. En la sección Mensaje de la acción Enviar correo electrónico interno, usas las siguientes variables.

Ejemplo de uso de bucle for para proporcionar información de pedido
EntradaSalida
Resumen del pedido:
{% for a in order.lineItems %}
SKU: {{a.sku}} ({{a.quantity}}),
{% endfor %}
Resumen del pedido:
8987097979 (50)
8877778887 (3)
888998898B (1)

Extraer las líneas de artículo de un pedido usando un bucle for con información adicional

Decides agregar más información al correo electrónico, incluyendo el nombre del producto, los SKU, el precio por artículo y la información de envío del cliente. En la sección Mensaje de la acción Enviar correo electrónico interno, usas las siguientes variables.

Ejemplo de uso de bucle for para proporcionar información de pedidos más extensa
EntradaSalida
Resumen del pedido:
{% for a in order.lineItems %}
Producto: {{a.title}}
SKU: {{a.sku}}
Precio (por unidad): $ {{a.originalUnitPriceSet.shopMoney.amount}}
Cantidad: {{a.quantity}}
{% endfor %}
Resumen del pedido:
Producto: leggings de cintura alta negros
SKU: 8987097979
Precio (por unidad): $ 8,49
Cantidad: 5
Producto: calcetines deportivos azules
SKU: 888998898B
Precio (por unidad): $ 5,61
Cantidad: 2

Extraer algunas líneas de artículos mediante la combinación de un bucle for y un enunciado if

Debes hacer seguimiento de los artículos vendidos que suministra un proveedor específico. En la sección Mensaje de la acción Enviar correo electrónico interno, usas las variables siguientes e incluyes una instrucción if en for loop.

Ejemplo de uso del bucle for e instrucción if para proporcionar información de pedidos a proveedores específicos
EntradaSalida
Producto de Acme vendido:
{% for x in order.lineItems %}
{% if x.vendor == 'acme-vendor' %}
Nombre del producto: {{x.title}}
SKU: {{x.sku}}
{% endif %}
{% endfor %}
Producto de Acme vendido:
Nombre del producto: leggings de cintura alta negros
SKU: 8987097979

Objetos de datos complejos en Shopify Flow

Flow te permite acceder a casi cualquier dato que esté en la Admin API de GraphQL, incluidos los objetos de datos complejos, como listas y objetos. Sin embargo, hay ciertas limitaciones sobre lo que puedes hacer con estos objetos. La sección describe estas limitaciones y proporciona ejemplos de cómo trabajar con ellas.

En lugar de llamar a listas y objetos directamente, debes hacer un bucle en la lista e incluir solo los campos que desees.

Por ejemplo, en lugar de llamar a {{ order.lineItems }} directamente, usa el siguiente formato para llamar a campos específicos. Estos ejemplos incluyen todos los campos que se incluirían al llamar directamente a la lista u objeto. Copia y pega los campos que necesites.

Text
{% 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 %}
json
{
    "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 %}
    ]
}
¿No encuentras las respuestas que estás buscando? Estamos aquí para ayudarte.