Menggunakan pemboleh ubah Liquid dalam Shopify Flow

Pemboleh ubah Liquid ialah ruang letak yang ditakrifkan dalam Liquid yang digantikan dengan nilai daripada GraphQL Admin API apabila aliran kerja dijalankan. Pemboleh ubah boleh menerangkan atribut pelanggan, pesanan dan produk yang terlibat dalam aliran kerja anda seperti nombor pesanan, harga pesanan atau nama pelanggan. Pemboleh ubah boleh digunakan dalam syarat untuk mengawal logik dalam aliran kerja anda atau untuk mengeluarkan data daripada tindakan.

Menambahkan pemboleh ubah dalam aliran kerja menggunakan Liquid

Anda boleh menambahkan pemboleh ubah menggunakan Liquid pada mana-mana medan teks yang mengandungi pautan Tambah pemboleh ubah. Klik pautan Tambah pemboleh ubah di bawah medan yang berkaitan, dan kemudian pilih pemboleh ubah daripada senarai.

Imej panel konfigurasi tindakan Hantar e-mel dalaman yang menyerlahkan pilihan 'Tambah pemboleh ubah' di bawah medan Subjek.

Pemboleh ubah dalam senarai Tambah pemboleh ubah telah ditapis, supaya anda hanya menggunakan pemboleh ubah yang dikembalikan oleh langkah-langkah sebelum langkah semasa, seperti pencetus. Contohnya, pencetus Pesanan Dicipta memberikan pesanan dan sumber kedai daripada Admin API yang boleh disisipkan sebagai pemboleh ubah. Selepas anda memilih pemboleh ubah daripada senarai, pemboleh ubah ditambahkan pada kotak teks sebagai Liquid yang diformat dengan betul.

Anda juga boleh menulis Liquid secara langsung dalam medan teks. Contohnya, anda boleh menggunakan pemboleh ubah {{ order.name }} untuk memaparkan rentetan pesanan daripada pentadbir Shopify, seperti order-123.

Oleh sebab Flow menggunakan Admin API untuk mengambil semula data yang digunakan untuk Liquid, sintaks pemboleh ubah menggunakan camel case. Pemboleh ubah camel case mempunyai perkataan pertama yang bermula dengan huruf kecil dan perkataan seterusnya bermula dengan huruf besar, seperti firstName atau canMarkAsPaid. Contohnya, untuk mengakses tarikh produk dicipta, masukkan {{ product.createdAt }}. Jika anda menggunakan sintaks Liquid dalam tema Shopify yang tidak menggunakan camel case, maka anda perlu memasukkan {{ product.created_at }}.

Tag bersyarat dan lelaran Liquid

Tag Liquid boleh digunakan dengan pemboleh ubah untuk melakukan fungsi yang berikut:

  • Menulis pernyataan bersyarat, seperti menentukan sama ada jumlah pesanan adalah lebih besar daripada $100.
  • Melelar menerusi senarai objek, seperti mengeluarkan data untuk setiap item baris dalam pesanan.

Anda boleh menggunakan tag Liquid untuk menulis pernyataan ini dan melelar menerusi objek.

Contohnya, Liquid yang berikut memaparkan nombor pesanan jika jumlah pesanan adalah lebih besar daripada $100:

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

Anda juga boleh menggunakan gelung for untuk melelar menerusi senarai objek, seperti item baris untuk pesanan. Contohnya, Liquid yang berikut memaparkan nama setiap item baris dalam pesanan:

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

Flow menyokong tag bersyarat (atau aliran kawalan) Liquid yang berikut:

Flow juga menyokong tag lelaran Liquid yang berikut:

Mengenakan penapis pada pemboleh ubah

Anda boleh mengubah data pemboleh ubah dalam Liquid menggunakan penapis. Flow menyokong semua penapis Liquid sumber terbuka.

Contohnya, Liquid yang berikut mengalih keluar awalan daripada nama pesanan dan mengeluarkan bahagian yang tinggal: {{ order.name | remove: "Order-" }}

Pertimbangan bagi penggunaan pemboleh ubah Liquid dalam penapis

Sebelum mengubah pemboleh ubah menggunakan penapis, semak pertimbangan yang berikut:

  • Flow tidak menyokong tatatanda titik yang tersedia untuk sesetengah penapis. Sebagai contoh, Flow menyokong {{ order.lineItems | size }} tetapi bukan {{ order.lineItems.size }}.
  • Flow tidak menyokong tatatanda titik untuk medan meta. Sebagai contoh, anda tidak boleh menggunakan {{ order.metafields.custom.hold_note }}. Sebaliknya, anda mesti menggunakan gelung pada medan meta seperti yang digariskan dalam contoh.
  • Flow tidak menyokong penggunaan indeks untuk mengakses item dalam senarai. Sebagai contoh, anda tidak boleh menggunakan {{ order.lineItems[0].title }}. Sebaliknya, anda mesti menggunakan gelung pada item baris seperti yang digariskan dalam contoh.

Penapis tarikh

Selain penapis standard Liquid, Flow menyediakan penapis tarikh untuk mendapatkan tarikh relatif kepada tarikh lain untuk menyokong ciri pencetus Masa yang dijadualkan dan Dapatkan data. Penapis ini ialah: date_minus dan date_plus. Sebagai contoh:

  • Untuk mengembalikan tarikh sehari pada masa hadapan: {{ "now" | date_plus: "1 day" }}
  • Untuk mengembalikan tarikh sehari pada masa lalu: {{ "now" | date_minus: "1 day" }}

Penapis ini menerima second, minute, day, week, month, dan year sebagai unit tempoh, secara tunggal (seperti second) atau jamak (seperti seconds). Anda juga boleh membekalkan jenis unit yang boleh disesuaikan yang berikut:

  • Integer yang mewakili bilangan saat: {{ "now" | date_minus: 3600 }}, iaitu 3600 bersamaan dengan 1 jam.
  • Rentetan tempoh ISO8601: {{ "now" | date_minus: "P1Y2D" }}, iaitu P1Y2D bermaksud 1 tahun dan 2 hari.

Penapis kriptografi

Flow menyediakan penapis kriptografi untuk pencincangan dan penciptaan Kod Pengesahan Mesej Berasaskan Cincangan (HMAC). Penapis ini berguna untuk mencipta pengenal pasti unik, hasil tambah semak atau mengintegrasikan dengan sistem pihak ketiga yang memerlukan format cincangan khusus.

Penapis pencincangan

Shopify Flow menyokong jenis penapis pencincangan yang berikut:

  • blake3 - Mencipta cincangan BLAKE3 (disyorkan untuk kegunaan umum).
  • sha256 - Mencipta cincangan SHA-256.
  • sha1 - Mencipta cincangan SHA-1.
  • md5 - Mencipta cincangan MD5.

Untuk tujuan pencincangan umum dan pelaksanaan baharu, anda harus menggunakan blake3 kerana ia menawarkan prestasi dan keselamatan yang lebih baik berbanding dengan algoritma yang lebih lama. Walau bagaimanapun, sha256, sha1 dan md5 tersedia untuk keserasian dengan sistem pihak ketiga.

Contoh penggunaan: {{ "hello world" | blake3 }} mengembalikan cincangan BLAKE3 untuk "hello world".

Penapis HMAC

Untuk mencipta HMAC dengan kunci rahsia, gunakan salah satu penapis disokong yang berikut:

Contoh penggunaan:

  • Asas: {{ "message" | hmac_sha256: "secret_key" }}
  • Dengan rahsia (disyorkan): {{ "message" | hmac_sha256: secrets.api_key }}

Contoh penggunaan pemboleh ubah dengan Liquid dalam Shopify Flow

Untuk mendapatkan pemahaman yang lebih baik tentang cara menggunakan pemboleh ubah Liquid, pertimbangkan contoh yang berikut:

Keluarkan URL untuk sumber

Anda mahu mengeluarkan URL untuk pelanggan, pesanan dan produk yang terlibat dalam aliran kerja.

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

Tukar senarai tag kepada medan meta

Anda mahu menukar set tag kepada medan meta yang merupakan senarai medan teks satu baris. Anda mencipta aliran kerja menggunakan pencetus Produk ditambahkan pada kedai dan menggunakan tindakan Kemas kini medan meta produk. Dalam bahagian Nilai bagi tindakan Kemas kini medan meta produk, anda menambah kod liquid yang berikut. Contoh ini menganggap bahawa anda hanya perlu menetapkan nilai sekali apabila produk dicipta dan produk mempunyai dua tag yang berkaitan: color:red dan color:orange.

Contoh liquid untuk menetapkan senarai medan teks satu baris.
InputOutput
{% 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"]

Tulis mesej e-mel dinamik untuk pesanan

Anda mahu mencipta aliran kerja untuk menghantar e-mel kepada pekerja apabila pelanggan berbelanja lebih daripada $500 untuk pesanan. Anda mencipta aliran kerja menggunakan pencetus Pesanan dicipta, menetapkan syarat menjadi benar jika jumlah pesanan melebihi $500 dan menggunakan tindakan Hantar e-mel dalaman. Dalam bahagian Mesej bagi tindakan Hantar e-mel dalaman, anda menggunakan pemboleh ubah yang berikut.

Contoh penggunaan pemboleh ubah untuk memberikan butiran pelanggan.
InputOutput
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 }}.
Sila hantar nota terima kasih peribadi kepada Jeanne Dupont (jeanne@example.com) kerana membuat pesanan bernilai $763.42.

Tulis mesej e-mel dinamik untuk produk yang kekurangan stok

Anda memutuskan bahawa anda perlu memaklumkan kakitangan apabila inventori produk semakin berkurangan dan pesanan perlu dibuat untuk mendapatkan lebih banyak stok. Anda mencipta aliran kerja yang bermula dengan pencetus Kuantiti inventori berubah dan menetapkan keadaan yang benar jika kuantiti inventori sebelum ini kurang daripada atau sama dengan 10. Dalam bahagian Mesej bagi tindakan Hantar e-mel dalaman, anda menggunakan pemboleh ubah yang berikut.

Contoh penggunaan pemboleh ubah untuk memberikan butiran item.
InputOutput
Please reorder {{ product.title }}. Email owner@store.com to verify that they've received the purchase order.
Sila pesan semula High Waist Leggings - Black. Hantar e-mel kepada owner@example.com untuk mengesahkan bahawa mereka telah menerima pesanan pembelian.

Tulis mesej e-mel dinamik untuk memberitahu kakitangan tentang pesanan palsu

Anda mahu membatalkan pesanan yang mempunyai tahap risiko tinggi, tetapi lebih suka kakitangan anda membatalkan pesanan itu secara manual. Anda mencipta aliran kerja yang bermula dengan pencetus Pesanan dicipta dan menetapkan keadaan yang benar jika tahap risiko pesanan adalah bersamaan dengan tinggi. Dalam bahagian Mesej bagi tindakan Hantar e-mel dalaman, anda menggunakan pemboleh ubah yang berikut.

Contoh penggunaan pemboleh ubah untuk memberikan maklumat tentang pesanan palsu.
InputOutput
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!
Kedai Shopify kami telah menerima pesanan dengan risiko penipuan yang tinggi. Kami ingin membatalkan pesanan ini dengan segera, sebelum pesanan ini dihantar untuk pengeluaran:

#1001
Dupont, Jeanne
jeanne@example.com

Sila sahkan status pesanan baharu. Terima kasih!

Keluarkan item baris untuk pesanan menggunakan gelung for

Apabila pesanan diterima, tindakan menghantar mesej yang mengandungi produk yang dipesan mungkin berguna. Anda boleh berbuat demikian dengan menggunakan for loop, yang melaksanakan blok kod secara berulang-ulang. Medan teks yang menyokong pemboleh ubah turut menyokong gelung for dan objek forloop.

Sebagai contoh, anda mahu mencipta aliran kerja yang mengembalikan senarai semua SKU dan kuantiti dalam suatu pesanan. Dalam bahagian Mesej bagi tindakan Hantar e-mel dalaman, anda menggunakan pemboleh ubah yang berikut.

Contoh penggunaan gelung for untuk memberikan maklumat pesanan.
InputOutput
Order summary:
{% for a in order.lineItems %}
  {{a.sku}} ( {{a.quantity}} )
{% endfor %}
Ringkasan pesanan:
8987097979 (50)
8877778887 (3)
888998898B (1)

Keluarkan item baris untuk pesanan menggunakan gelung for berserta maklumat tambahan

Anda memutuskan untuk menambahkan lebih banyak maklumat pada e-mel, termasuk nama produk, SKU, harga setiap item dan maklumat pengiriman pelanggan. Dalam bahagian Mesej bagi tindakan Hantar e-mel dalaman, anda menggunakan pemboleh ubah yang berikut.

Contoh penggunaan gelung for untuk memberikan maklumat pesanan yang lebih menyeluruh.
InputOutput
Order summary:
{% for a in order.lineItems %}
  Product: {{a.title}}
  SKU: {{a.sku}}
  Price (per unit): ${{a.originalUnitPriceSet.shopMoney.amount}}
  Quantity: {{a.quantity}}
{% endfor %}
Ringkasan pesanan:
Produk: High Waist Leggings - Black
SKU: 8987097979
Harga (setiap unit): $8.49
Kuantiti: 5
Produk: Athletic Socks - Blue
SKU: 888998898B
Harga (setiap unit): $5.61
Kuantiti: 2

Keluarkan beberapa item baris dengan menggabungkan gelung for dan pernyataan if

Anda perlu menjejak item yang dijual dan dibekalkan oleh vendor tertentu. Dalam bahagian Mesej bagi tindakan Hantar e-mel dalaman, anda menggunakan pemboleh ubah yang berikut dan menyertakan pernyataan if dalam for loop anda.

Contoh penggunaan gelung for dan pernyataan if untuk memberikan maklumat pesanan bagi vendor tertentu.
InputOutput
Acme product sold:
{% for x in order.lineItems %}
  {% if x.vendor == 'acme-vendor' %}
    Product name: {{x.title}}
    SKU: {{x.sku}}
  {% endif %}
{% endfor %}
Produk Acme yang dijual:
Nama produk: High Waist Leggings - Black
SKU: 8987097979

Objek data yang kompleks dalam Shopify Flow

Flow membolehkan anda mengakses hampir semua data yang terdapat dalam GraphQL Admin API. Ini termasuk objek data yang kompleks seperti senarai dan objek. Walau bagaimanapun, terdapat beberapa had untuk perkara yang boleh anda lakukan dengan objek ini. Bahagian ini menggariskan had tersebut dan memberikan contoh cara untuk menggunakannya.

Daripada memanggil senarai dan objek secara terus, anda seharusnya membuat gelung pada senarai dan hanya menyertakan medan yang anda mahukan.

Sebagai contoh, daripada memanggil {{ order.lineItems }} secara terus, gunakan format yang berikut untuk memanggil medan tertentu. Contoh ini merangkumi semua medan yang akan disertakan dengan memanggil senarai atau objek secara terus. Salin dan tampal medan yang anda perlukan.

Teks
{% 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 %}
]

}