Liquid-muuttujien käyttö Shopify Flow'ssa

Liquid-muuttujat ovat Liquidissä määritettyjä paikkamerkkejä, jotka korvataan GraphQL Admin API -rajapinnan arvoilla, kun työnkulku suoritetaan. Muuttujat voivat kuvata työnkuluissasi mukana olevien asiakkaiden, tilausten ja tuotteiden attribuutteja, kuten tilausnumeroa, tilauksen hintaa tai asiakkaan nimeä. Muuttujia voidaan käyttää ehdoissa työnkulun logiikan ohjaamiseen tai tietojen tulostamiseen toiminnosta.

Muuttujien lisääminen työnkulkuihin Liquidin avulla

Voit lisätä Liquid-muuttujia mihin tahansa tekstikenttään, jossa on Lisää muuttuja -linkki. Klikkaa kyseisen kentän alla olevaa Lisää muuttuja -linkkiä ja valitse sitten muuttuja luettelosta.

Kuva Lähetä sisäinen sähköposti -toiminnon määrityspaneelista, jossa korostetaan Aihe-kentän alla oleva Lisää muuttuja -vaihtoehto.

Lisää muuttuja -luettelon muuttujat suodatetaan niin, että käytät vain muuttujia, jotka palautetaan nykyistä vaihetta edeltävistä vaiheista, kuten käynnistimistä. Esimerkiksi Tilaus luotu -käynnistin tarjoaa Admin APIsta tilaus- ja kaupparesursseja, jotka voidaan lisätä muuttujina. Kun olet valinnut muuttujan luettelosta, se lisätään tekstiruutuun oikein muotoiltuna Liquid-koodina.

Voit myös kirjoittaa Liquid-koodia suoraan tekstikenttään. Voit esimerkiksi käyttää muuttujaa {{ order.name }} näyttämään tilauksen nimen Shopifyn ohjausnäkymästä, kuten tilaus-123.

Koska Flow käyttää Admin APIa Liquid-koodissa käytettävien tietojen noutamiseen, muuttujien syntaksissa käytetään kamelinnotkeaa kirjoitustapaa. Kamelinnotkeassa kirjoitustavassa muuttujien ensimmäinen sana alkaa pienellä kirjaimella ja seuraavat sanat alkavat isolla kirjaimella, kuten firstName tai canMarkAsPaid. Jos esimerkiksi haluat käyttää tuotteen luontipäivämäärää, kirjoita {{ product.createdAt }}. Jos käytät Liquid-syntaksia Shopify-teemassa, jossa ei käytetä kamelinnotkeaa kirjoitustapaa, kirjoittaisit {{ product.created_at }}.

Ehdolliset ja iteroivat Liquid-tagit

Liquid-tageja voidaan käyttää muuttujien kanssa seuraavien toimintojen suorittamiseen:

  • Ehdollisten lauseiden kirjoittaminen, kuten sen määrittäminen, onko tilauksen kokonaissumma suurempi kuin 100 dollaria.
  • Objektiluettelon iterointi, kuten kunkin tilauksen rivikohdan tietojen tulostaminen.

Voit käyttää Liquid-tageja näiden lauseiden kirjoittamiseen ja objektien iterointiin.

Seuraava Liquid-koodi näyttää esimerkiksi tilausnumeron, jos tilauksen kokonaissumma on suurempi kuin 100 dollaria:

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

Voit myös käyttää for-silmukkaa objektiluettelon, kuten tilauksen rivikohtien, iterointiin. Seuraava Liquid-koodi näyttää esimerkiksi tilauksen kunkin rivikohdan nimen:

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

Flow tukee seuraavia Liquid-ehtolauseiden (tai ohjausrakenteiden) tageja:

Flow tukee myös seuraavia Liquid-iterointitageja:

Suodattimien käyttäminen muuttujiin

Voit muuntaa muuttujien tietoja Liquidissä käyttämällä suodattimia. Flow tukee kaikkia avoimen lähdekoodin Liquid-suodattimia.

Esimerkiksi seuraava Liquid-koodi poistaa etuliitteen tilauksen nimestä ja tulostaa jäljelle jäävän osan: {{ order.name | remove: "Tilaus-" }}

Huomioitavaa Liquid-muuttujien käyttämisestä suodattimissa

Ennen muuttujien muuntamista suodattimien avulla on syytä huomioida seuraavat seikat:

  • Flow ei tue pistenotaatiota, joka on käytettävissä joissakin suodattimissa. Esimerkiksi Flow tukee muotoa {{ order.lineItems | size }}, mutta ei muotoa {{ order.lineItems.size }}.
  • Flow ei tue pistenotaatiota metakentille. Et voi esimerkiksi käyttää muotoa {{ order.metafields.custom.hold_note }}. Sen sijaan sinun on käsiteltävä metakentät silmukassa esimerkkien mukaisesti.
  • Flow ei tue indeksien käyttöä luettelon kohteiden käyttämiseen. Et voi esimerkiksi käyttää muotoa {{ order.lineItems[0].title }}. Sen sijaan sinun on käsiteltävä rivikohdat silmukassa esimerkkien mukaisesti.

Päivämääräsuodattimet

Tavallisten Liquid-suodattimien lisäksi Flow tarjoaa päivämääräsuodattimia, joilla voi hakea toiseen päivämäärään suhteutetun päivämäärän Ajastettu aika -käynnistimen ja Nouda tiedot -ominaisuuksien tukemiseksi. Nämä suodattimet ovat: date_minus ja date_plus. Esimerkki:

  • Päivämäärän palauttaminen, joka on yhden päivän päässä tulevaisuudessa: {{ "now" | date_plus: "1 day" }}
  • Päivämäärän palauttaminen, joka on yhden päivän päässä menneisyydessä: {{ "now" | date_minus: "1 day" }}

Nämä suodattimet hyväksyvät keston yksiköksi sanat `second` (sekunti), `minute` (minuutti), `day` (päivä), `week` (viikko), `month` (kuukausi) ja `year` (vuosi) sekä yksikössä (esim. `second`) että monikossa (esim. `seconds`). Voit myös antaa seuraavan tyyppisiä mukautettavia yksiköitä:

  • Kokonaisluku, joka edustaa sekuntien määrää: {{ "now" | date_minus: 3600 }}, jossa 3600 vastaa yhtä tuntia.
  • ISO 8601 -kestomerkkijono: {{ "now" | date_minus: "P1Y2D" }}, jossa P1Y2D tarkoittaa yhtä vuotta ja kahta päivää.

Kryptografiset suodattimet

Flow tarjoaa salausteknisiä suodattimia hajautukseen ja hajautuspohjaisten viestin todennuskoodien (HMAC) luomiseen. Nämä suodattimet ovat hyödyllisiä yksilöllisten tunnisteiden ja tarkistussummien luomisessa tai integroinnissa kolmannen osapuolen järjestelmiin, jotka edellyttävät tiettyjä hajautusmuotoja.

Hajautussuodattimet

Shopify Flow tukee seuraavanlaisia hajautussuodattimia:

  • blake3 – Luo BLAKE3-hajautuksen (suositellaan yleiseen käyttöön).
  • sha256 – Luo SHA-256-hajautuksen.
  • sha1 – Luo SHA-1-hajautuksen.
  • md5 – Luo MD5-hajautuksen.

Yleisiin hajautustarkoituksiin ja uusiin toteutuksiin kannattaa käyttää blake3-suodatinta, sillä se tarjoaa paremman tehokkuuden ja tietoturvan vanhempiin algoritmeihin verrattuna. Suodattimet sha256, sha1 ja md5 ovat kuitenkin käytettävissä yhteensopivuuden varmistamiseksi kolmannen osapuolen järjestelmien kanssa.

Esimerkkikäyttö: {{ "hello world" | blake3 }} palauttaa merkkijonon ”hello world” BLAKE3-hajautuksen.

HMAC-suodattimet

Voit luoda HMAC-koodin salaisella avaimella käyttämällä jotakin seuraavista tuetuista suodattimista:

Esimerkkikäyttö:

  • Perus: {{ "message" | hmac_sha256: "secret_key" }}
  • Salaisuuksilla (suositus): {{ "message" | hmac_sha256: secrets.api_key }}

Esimerkkejä Liquid-muuttujien käytöstä Shopify Flow'ssa

Seuraavien esimerkkien avulla saat paremman käsityksen siitä, miten Liquid-muuttujia käytetään:

Resurssien URL-osoitteiden tulostaminen

Haluat tulostaa työnkulkuun liittyvän asiakkaan, tilauksen ja tuotteen URL-osoitteet.

# 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>

Tunnisteluettelon muuntaminen metakentäksi

Haluat muuntaa tunnistejoukon metakentäksi, joka on yksirivisten tekstikenttien luettelo. Luot työnkulun, joka käyttää Tuote lisätty kauppaan -käynnistintä, ja käytät Päivitä tuotteen metakenttä -toimintoa. Lisäät Päivitä tuotteen metakenttä -toiminnon Arvo-osioon seuraavan Liquid-koodin. Tässä esimerkissä oletetaan, että sinun tarvitsee määrittää arvot vain kerran tuotetta luotaessa ja että tuotteella on kaksi oleellista tunnistetta: color:red ja color:orange.

Esimerkki-Liquid yksirivisen tekstikentän luettelon määrittämiseen.
SyöteTuloste
{% 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: ","}}]
      
["red","orange"]

Dynaamisen sähköpostiviestin kirjoittaminen tilaukselle

Haluat luoda työnkulun, joka lähettää sähköpostia työntekijälle, kun asiakas käyttää yli 500 $ tilaukseen. Luot työnkulun Tilaus luotu -käynnistimellä, asetat ehdon, joka on tosi, jos tilauksen kokonaissumma on yli 500 $, ja käytät Lähetä sisäinen sähköposti -toimintoa. Käytät Lähetä sisäinen sähköposti -toiminnon Viesti-osiossa seuraavia muuttujia.

Esimerkki muuttujien käytöstä asiakastietojen antamiseen.
SyöteTuloste
Please send a personal thank you note to {{ order.customer.firstName }} {{ order.customer.lastName }}({{ order.customer.email }}) for placing an order for $ {{ order.totalPriceSet.shopMoney.amount }}.
Lähetä henkilökohtainen kiitosviesti Jeanne Dupontille (jeanne@example.com) 763,42 $:n tilauksen tekemisestä.

Dynaamisen sähköpostiviestin kirjoittaminen vähissä olevasta tuotteesta

Päätät, että sinun on ilmoitettava henkilöstön jäsenelle, kun tuotteen varastomäärä on vähissä ja sitä on tilattava lisää. Luot työnkulun, joka alkaa Varastomäärä muuttunut -käynnistimellä, ja asetat ehdon, joka on tosi, jos edellinen varastomäärä on enintään 10. Käytät Lähetä sisäinen sähköposti -toiminnon Viesti-osiossa seuraavia muuttujia.

Esimerkki muuttujien käytöstä tuotteen tietojen antamiseen.
SyöteTuloste
Please reorder {{ product.title }}. Email owner@store.com to verify that they've received the purchase order.
Tilaa uudestaan tuotetta High Waist Leggings - Black. Varmista sähköpostitse osoitteesta owner@example.com, että he ovat vastaanottaneet ostotilauksen.

Dynaamisen sähköpostiviestin kirjoittaminen vilpillisestä tilauksesta ilmoittamiseksi henkilöstölle

Haluat peruuttaa tilaukset, joilla on korkea riskitaso, mutta haluat henkilöstösi peruuttavan tilauksen manuaalisesti. Luot työnkulun, joka alkaa Tilaus luotu -käynnistimellä, ja asetat ehdon, joka on tosi, jos tilauksen riskitaso on korkea. Käytät Lähetä sisäinen sähköposti -toiminnon Viesti-osiossa seuraavia muuttujia.

Esimerkki muuttujien käytöstä vilpillistä tilausta koskevien tietojen antamiseen.
SyöteTuloste
Our Shopify store has received an order with a high risk of fraud. We would like to cancel this order right away, before it is sent to production:
{{ order.name }} {{ order.billingAddress.lastName }}, {{ order.billingAddress.firstName }} {{ order.email }}
Please confirm the new order status. Thanks!
Shopify-kauppamme on vastaanottanut tilauksen, jolla on suuri petosriski. Haluaisimme peruuttaa tämän tilauksen välittömästi ennen kuin se siirtyy tuotantoon:

#1001
Dupont, Jeanne
jeanne@example.com

Vahvista uusi tilauksen tila. Kiitos!

Tilauksen rivikohtien tulostaminen for-silmukalla

Kun tilaus vastaanotetaan, voi olla hyödyllistä lähettää viesti, joka sisältää tilatut tuotteet. Voit tehdä tämän käyttämällä for-silmukkaa, joka suorittaa koodilohkon toistuvasti. Muuttujia tukevat tekstikentät tukevat myös for-silmukoita ja forloop-objektia.

Haluat esimerkiksi luoda työnkulun, joka palauttaa luettelon kaikista tilauksen SKU-koodeista ja määristä. Käytät Lähetä sisäinen sähköposti -toiminnon Viesti-osiossa seuraavia muuttujia.

Esimerkki for-silmukan käytöstä tilaustietojen antamiseen.
SyöteTuloste
Order summary:
{% for a in order.lineItems %}
  {{a.sku}} ( {{a.quantity}} )
{% endfor %}
Tilauksen yhteenveto:
8987097979 (50)
8877778887 (3)
888998898B (1)

Tulosta tilauksen rivikohdat lisätietojen kanssa for-silmukan avulla

Päätät lisätä sähköpostiin enemmän tietoja, kuten tuotteen nimen, SKU-koodit, yksikköhinnan ja asiakkaan toimitustiedot. Käytät Lähetä sisäinen sähköposti -toiminnon Viesti-osiossa seuraavia muuttujia.

Esimerkki for-silmukan käytöstä laajempien tilaustietojen antamiseen.
SyöteTuloste
Order summary:
{% for a in order.lineItems %}
  Product: {{a.title}}
  SKU: {{a.sku}}
  Price (per unit): ${{a.originalUnitPriceSet.shopMoney.amount}}
  Quantity: {{a.quantity}}
{% endfor %}
Tilauksen yhteenveto:
Tuote: High Waist Leggings - Black
SKU: 8987097979
Hinta (yksikköä kohti): 8,49 $
Määrä: 5
Tuote: Athletic Socks - Blue
SKU: 888998898B
Hinta (yksikköä kohti): 5,61 $
Määrä: 2

Tulosta joitakin rivikohtia yhdistämällä for-silmukka ja if-lause

Sinun on seurattava tietyn myyjän toimittamia myytyjä tuotteita. Käytät Lähetä sisäinen sähköposti -toiminnon Viesti-osiossa seuraavia muuttujia ja sisällytät if-lauseen for-silmukkaan.

Esimerkki for-silmukan ja if-lauseen käytöstä tiettyjen myyjien tilaustietojen antamiseen.
SyöteTuloste
Acme product sold:
{% for x in order.lineItems %}
  {% if x.vendor == 'acme-vendor' %}
    Product name: {{x.title}}
    SKU: {{x.sku}}
  {% endif %}
{% endfor %}
Acme-tuote myyty:
Tuotteen nimi: High Waist Leggings - Black
SKU: 8987097979

Monimutkaiset tieto-objektit Shopify Flow'ssa

Flow'n avulla voit käyttää lähes kaikkia GraphQL Admin API:n tietoja. Tähän sisältyy monimutkaisia tieto-objekteja, kuten luetteloita ja objekteja. Näiden objektien käyttämiselle on kuitenkin joitakin rajoituksia. Tässä osiossa esitellään nämä rajoitukset ja annetaan esimerkkejä niiden kanssa työskentelystä.

Sen sijaan, että kutsuisit luetteloita ja objekteja suoraan, sinun tulisi käydä luettelo läpi silmukalla ja sisällyttää siihen vain haluamasi kentät.

Sen sijaan, että kutsuisit esimerkiksi suoraan {{ order.lineItems }}, käytä seuraavaa muotoa tiettyjen kenttien kutsumiseen. Nämä esimerkit sisältävät kaikki kentät, jotka sisällytettäisiin kutsumalla luetteloa tai objektia suoraan. Kopioi ja liitä tarvitsemasi kentät.

Teksti
{% 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 %}
            ],
&#x22;discountAllocations&#x22;: [
            {% for da in li.discountAllocations %}
                {% if forloop.first != true %},{% endif %}
                &#x22;allocatedAmountSet&#x22;: {
                    &#x22;presentmentMoney&#x22; : {
                        &#x22;amount&#x22;: {{ da.allocatedAmountSet.presentmentMoney.amount | json }},
                        &#x22;currencyCode&#x22;: {{ da.allocatedAmountSet.presentmentMoney.currencyCode | json }}
                    },
                    &#x22;shopMoney&#x22;: {
                        &#x22;amount&#x22;: {{ da.allocatedAmountSet.shopMoney.amount | json }},
                        &#x22;currencyCode&#x22;: {{ da.allocatedAmountSet.shopMoney.currencyCode | json }}
                    }
                }
            {% endfor %}
        ],

        &#x22;discountedTotalSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.discountedTotalSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.discountedTotalSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.discountedTotalSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.discountedTotalSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;discountedUnitPriceSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.discountedUnitPriceSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.discountedUnitPriceSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.discountedUnitPriceSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.discountedUnitPriceSet.shopMoney.currencyCode | json }}
            }
        },
        &#x22;duties&#x22;: [
            {% for duty li.duties %}
            {% if forloop.first != true %},{% endif %}
            {
                {% comment %}rest of duties omitted{% endcomment %}
                &#x22;id&#x22;: {{ duty.id | json }}
            }
            {% endfor %}
        ],
        &#x22;fulfillableQuantity&#x22;: {{ li.fulfillableQuantity | json }},

        &#x22;fulfillmentService&#x22;: {
            &#x22;callbackUrl&#x22;:{{ li.fulfillmentService.callbackUrl | json }},
            &#x22;fulfillmentOrdersOptIn&#x22;: {{ li.fulfillmentService.fulfillmentOrdersOptIn | json }},
            &#x22;handle&#x22;: {{ li.fulfillmentService.handle | json }},
            &#x22;id&#x22;: {{ li.fulfillmentService.id | json }},
            &#x22;inventoryManagement&#x22;: {{ li.fulfillmentService.inventoryManagement | json }},
            {% comment %}fulfillmentService.inventoryManagement - omitted {% endcomment %}
            &#x22;productBased&#x22;: {{ li.fulfillmentService.productBased | json }},
            &#x22;serviceName&#x22;: {{ li.fulfillmentService.serviceName | json }},
            &#x22;shippingMethods&#x22;: [
                {% for sm in li.fulfillmentService.shippingMethods %}
                    {% if forloop.first != true %},{% endif %}
                    {
                        &#x22;code&#x22;: {{ sm.code | json }},
                        &#x22;label&#x22;: {{ sm.label | json }}
                    }
                {% endfor %}
            ],
            &#x22;type&#x22;: {{ li.fulfillmentService.type | json }}

        },
        &#x22;fulfillmentStatus&#x22;: {{ li.fulfillmentStatus | json }},
        &#x22;id&#x22;: {{ li.id | json }},
        &#x22;image&#x22;: {
            &#x22;altText&#x22;: {{ li.image.altText | json }},
            &#x22;height&#x22;: {{ li.image.height | json }},
            &#x22;id&#x22;: {{ li.image.id | json }},
            {% comment %}li.image.metafield omitted{% endcomment %}
            {% comment %}li.image.privateMetafield omitted{% endcomment %}
            &#x22;width&#x22;:{{ li.image.width | json }}
        },
        &#x22;merchantEditable&#x22;: {{ li.merchantEditable | json }},
        &#x22;name&#x22;: {{ li.name | json }},
        &#x22;nonFulfillableQuantity&#x22;: {{ li.nonFulfillableQuantity | json }},

        &#x22;originalTotalSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.originalTotalSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.originalTotalSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.originalTotalSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.originalTotalSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;originalUnitPriceSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.originalUnitPriceSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.originalUnitPriceSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.originalUnitPriceSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.originalUnitPriceSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;product&#x22;: {
            {% comment %}rest of Product omitted{% endcomment %}
            &#x22;title&#x22;: {{ li.product.title | json }}
        },

        &#x22;quantity&#x22;: {{ li.quantity | json }},
        &#x22;refundableQuantity&#x22;: {{ li.refundableQuantity | json }},
        &#x22;requiresShipping&#x22;: {{ li.requiresShipping | json }},
        &#x22;restockable&#x22;: {{ li.restockable | json }},

        &#x22;sellingPlan&#x22;: {
            &#x22;name&#x22;: {{ li.sellingPlan.name | json }}
        },

        &#x22;sku&#x22;: {{ li.sku | json }},

        &#x22;taxLines&#x22;: [
            {% for tl in li.taxLines %}
                {% if forloop.first != true %},{% endif %}
                {
                    &#x22;priceSet&#x22;: {
                        &#x22;presentmentMoney&#x22; : {
                            &#x22;amount&#x22;: {{ tl.priceSet.presentmentMoney.amount | json }},
                            &#x22;currencyCode&#x22;: {{ tl.priceSet.presentmentMoney.currencyCode | json }}
                        },
                        &#x22;shopMoney&#x22;: {
                            &#x22;amount&#x22;: {{ tl.priceSet.shopMoney.amount | json }},
                            &#x22;currencyCode&#x22;: {{ tl.priceSet.shopMoney.currencyCode | json }}
                        }
                    },
                    &#x22;rate&#x22;: {{ tl.rate | json }},
                    &#x22;ratePercentage&#x22;: {{ tl.ratePercentage | json }},
                    &#x22;title&#x22;: {{ tl.title | json }}
                }
            {% endfor %}
        ],
        &#x22;taxable&#x22;:{{ li.taxable | json }},
        &#x22;title&#x22;:{{ li.title | json }},

        &#x22;totalDiscountSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.totalDiscountSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.totalDiscountSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.totalDiscountSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.totalDiscountSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;unfulfilledDiscountedTotalSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.unfulfilledDiscountedTotalSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.unfulfilledDiscountedTotalSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.unfulfilledDiscountedTotalSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.unfulfilledDiscountedTotalSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;unfulfilledOriginalTotalSet&#x22;: {
            &#x22;presentmentMoney&#x22; : {
                &#x22;amount&#x22;: {{ li.unfulfilledOriginalTotalSet.presentmentMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.unfulfilledOriginalTotalSet.presentmentMoney.currencyCode | json }}
            },
            &#x22;shopMoney&#x22;: {
                &#x22;amount&#x22;: {{ li.unfulfilledOriginalTotalSet.shopMoney.amount | json }},
                &#x22;currencyCode&#x22;: {{ li.unfulfilledOriginalTotalSet.shopMoney.currencyCode | json }}
            }
        },

        &#x22;unfulfilledQuantity&#x22;: {{ li.unfulfilledQuantity | json }},

        &#x22;variant&#x22;: {
            {% comment %}rest of variant omitted {% endcomment %}
            &#x22;title&#x22;: {{ li.variant.title | json }}
        },

        &#x22;variantTitle&#x22;: {{ li.variantTitle | json }},
        &#x22;vendor&#x22;: {{ li.vendor | json }}
    }
{% endfor %}
]

}