Di 14 Objects Produk dan Koleksi dan 15 Objects Konten kita bahas apa yang ditampilin. Sekarang object yang muncul waktu uang beneran mulai jalan: keranjang, pelanggan, dan pesanan.
Urutan alurnya di toko: pengunjung masukin produk ke cart (isinya line_item), lanjut ke checkout, jadi order yang punya transaction dan fulfillment, dan semuanya nempel ke customer. Bab ini ngikutin urutan itu.
Ingat aturan dari 14 Objects Produk dan Koleksi > Soal Harga Subunit: semua harga di sini dalam subunit dan mata uang lokal pelanggan, selalu tampilin lewat filter money.
cart
Keranjang belanja. Global, bisa diakses dari mana aja, karena ikon keranjang di header butuh tau jumlah item di semua halaman.
1. Isi Keranjang
items, arrayline_item. Ini isinya.item_count, jumlah total item (jumlah kuantitas, bukan jumlah baris). Dua kaos dan satu topi = 3.empty?,truekalau kosong. Lebih jelas daripadaitem_count == 0.currency, mata uang keranjang, objectcurrency.requires_shipping,truekalau ada produk yang butuh dikirim.total_weight, berat total dalam gram.
2. Harga
Urutan dari kotor ke bersih:
original_total_price, total sebelum diskon apapun.items_subtotal_price, total item setelah diskon per baris, tapi sebelum diskon level keranjang, pajak (kecuali pajak termasuk harga), dan ongkir.total_discount, total semua diskon (jumlah yang dihemat).total_price, total setelah semua diskon.checkout_charge_amount, jumlah yang bakal ditagih saat checkout. Beda samatotal_pricekalau ada selling plan yang bayarnya belakangan (pre-order, try before you buy).taxes_included,truekalau pajak udah termasuk di harga.duties_included,truekalau bea masuk udah termasuk.
Pola ringkasan keranjang:
<p>Subtotal: {{ cart.items_subtotal_price | money }}</p>
{% if cart.total_discount > 0 %}
<p>Hemat: {{ cart.total_discount | money }}</p>
{% endif %}
<p>Total: {{ cart.total_price | money }}</p>3. Diskon
discount_applications, arraydiscount_applicationsemua diskon di keranjang.cart_level_discount_applications, cuma yang level keranjang (bukan per baris).discounts, deprecated karena gak semua jenis diskon tercakup. Pakaidiscount_applications.
4. Catatan dan Atribut
Merchant sering butuh info tambahan dari pembeli: “mau dibungkus kado?”, “tulisan ukiran apa?”. Dua mekanismenya:
note, satu teks bebas. Ditangkap pakai input bernama note di dalam form keranjang:
<label>Gift note:</label>
<textarea name="note"></textarea>Cuma boleh ada satu {{ cart.note }} di halaman keranjang. Kalau ada dua, yang dikirim cuma yang paling bawah di DOM.
attributes, pasangan nama-nilai bebas. Ditangkap pakai input bernama attributes[nama]:
<label>What do you want engraved on your cauldron?</label>
<input type="text" name="attributes[cauldron-engraving]" value="{{ cart.attributes.cauldron-engraving }}" />Trik: awali nama atribut pakai __ (dua garis bawah) biar jadi privat. Atribut privat gak bisa dibaca dari Liquid atau Ajax API, cocok buat data yang gak ngaruh ke tampilan (misalnya ID pelacakan), dan bikin cache halaman lebih efektif karena Shopify tau data itu gak ngubah render.
Bahasan form keranjang lengkap di 24 Template per Halaman.
line_item
Satu baris di keranjang atau order. Satu baris = satu varian dengan kuantitas tertentu.
1. Identitas
iddankey, ID dan kunci unik baris.keyyang dipakai Ajax API buat ngubah baris tertentu.title, gabunganproduct.titledanvariant.titledipisah tanda hubung, misalnyaHealth potion - S / Low.product, objectproduct-nya (bisa jugaremote_product).product_id.variant, objectvariant-nya.variant_id.skudanvendor.image, gambar varian, atau gambar unggulan produk kalau varian gak punya gambar.url, URL variannya.url_to_remove, URL buat ngehapus baris ini dari keranjang. Cara paling sederhana bikin tombol hapus tanpa JavaScript.options_with_values, arrayoption_with_valuebuat nampilin “Size: S, Strength: Low”.quantity, jumlah.gift_card,truekalau produknya gift card.requires_shipping,taxable,grams(berat dalam satuan default toko).
2. Harga
Ada dua sumbu: per unit vs per baris, dan sebelum vs sesudah diskon:
original_price, harga satu unit sebelum diskon.final_price, harga satu unit sesudah diskon per baris.original_line_price, harga seluruh baris (unit × kuantitas) sebelum diskon.final_line_price, harga seluruh baris sesudah diskon per baris.line_level_total_discount, total diskon yang kena baris ini.unit_pricedanunit_price_measurement, buat unit pricing.
Yang deprecated: price, line_price, total_discount, dan discounts. Pakai versi original_* / final_*.
❌ deprecated
{{ item.line_price | money }}✅ benar, dan jelas mana yang sebelum dan sesudah diskon
{% if item.original_line_price != item.final_line_price %}
<s>{{ item.original_line_price | money }}</s>
{% endif %}
{{ item.final_line_price | money }}3. Diskon
discount_allocations, arraydiscount_allocationsemua diskon yang kena baris ini.line_level_discount_allocations, cuma yang langsung ke baris ini (bukan bagian dari diskon keranjang).message, info soal diskon yang mempengaruhi baris ini.
4. Properti Baris (Line Item Properties)
Ini cara ngasih info kustom per item, beda sama cart.attributes yang per keranjang. Contoh: teks ukiran buat item tertentu. Ditangkap di form produk pakai input bernama properties[nama]:
{% form 'product', product %}
...
<label for="engravingText">Engraving</label>
<input type="text" id="engravingText" name="properties[Engraving]">
...
{% endform %}Di keranjang, dibaca lewat properties yang bisa di-loop:
{% for property in item.properties %}
{{ property.first }}: {{ property.last }}
{% endfor %}Sama kaya atribut keranjang, nama properti berawalan _ (satu garis bawah) disembunyiin dari checkout dan email, tapi tetap kebaca di Liquid. Buat data teknis yang gak perlu dilihat pembeli.
5. Selling Plan dan Bundle
selling_plan_allocation, alokasi selling plan baris ini (buat langganan).nilkalau gak ada.item_components, arrayline_itemkomponen kalau baris ini bundle. Cuma di keranjang.parent_relationship, punyaparentyang ngasih baris induk kalau baris ini komponen bundle. Cuma di keranjang.instructions, aturan buat baris bersarang:can_removedancan_update_quantity. Komponen bundle biasanya gak boleh dihapus sendiri-sendiri.
6. Di Order
Properti yang cuma bermakna di order.line_items:
fulfillment, objectfulfillmentbaris ini.fulfillment_service, layanan pemenuhannya,manualkalau gak ada.successfully_fulfilled_quantity, berapa yang udah dikirim.tax_lines, arraytax_line.
7. Error
error_message, pesan error soal status baris dalam bahasa pembeli, misalnya “Stok cuma tersisa 2”. Cuma tersedia di keranjang buat toko yang pakai Checkout Extensibility.
customer
Pelanggan toko. Global kalau pelanggan lagi login, dan juga tersedia di template customers/account, customers/addresses, customers/order, serta lewat checkout.customer, gift_card.customer, dan order.customer. Di luar itu, kalau gak login, nil.
Ini yang bikin pola “kalau login tampilin nama, kalau nggak tampilin tombol login” jadi gampang:
{% if customer %}
Halo, {{ customer.first_name }}!
<a href="{{ routes.account_logout_url }}">Keluar</a>
{% else %}
<a href="{{ routes.account_login_url }}">Masuk</a>
{% endif %}1. Identitas
id,email,phone.first_name,last_name,name(lengkap).has_account,truekalau emailnya terhubung ke akun. Di checkout, ini bisatruewalaupun pelanggan belum login, cukup masukin email yang terdaftar.has_avatar?,truekalau punya avatar.accepts_marketing,truekalau setuju nerima marketing.tags, array tag pelanggan (merchant sering pakai ini buat “VIP”, “wholesale”, dan sebagainya).tax_exempt,truekalau bebas pajak.metafields.
2. Alamat
addresses, arrayaddress. Bisa di-paginate.addresses_count.default_address, alamat utama.
3. Order
orders, arrayorder. Bisa di-paginate.orders_count, jumlah order.last_order, order terakhir, gak termasuk order tes.total_spent, total belanja sepanjang masa dalam subunit.
4. Pembayaran dan Kredit
payment_methods, arraycustomer_payment_method(metode pembayaran tersimpan) denganpayment_instrument_type(misalnyacredit_card) dantoken.store_credit_account, object denganbalance(objectmoney) buat saldo kredit toko.
5. B2B
Buat pelanggan bisnis:
b2b?,truekalau pelanggan B2B.current_company, objectcompanyyang lagi dibelanjain.current_location, objectcompany_locationyang lagi dipilih.company_available_locations, array lokasi perusahaan yang bisa diakses pelanggan.company_available_locations_count.
Bahasannya di 42 Harga Diskon, Currency, Unit Pricing, Installments, B2B.
Object B2B
1. company
Perusahaan pelanggan B2B: id, name, external_id, metafields, available_locations (array company_location), dan available_locations_count.
2. company_location
Satu lokasi perusahaan:
id,name,external_id,metafields.company, perusahaan induknya.current?,truekalau lokasi ini yang lagi dipilih.url_to_set_as_current, URL buat ngeset lokasi ini jadi aktif. Ini yang dipakai buat pemilih lokasi di header.shipping_address, objectcompany_address.tax_registration_id, NPWP-nya.store_credit_account.
3. company_address
Mirip address biasa, tapi punya attention (baris “u.p.” / perhatian) dan gak punya phone, company, name, summary, url.
order
Satu pesanan yang udah jadi. Tersedia di template customers/order dan lewat customer.orders, customer.last_order, checkout.order.
1. Identitas
id.name, nama order kaya#1001.order_number, versi angkanya,1001.confirmation_number, kode acak kayaXPAV284CTyang boleh ditampilin ke pelanggan sebagai ganti nomor urut. Nomor urut itu bocorin volume penjualan toko ke pesaing, kode acak nggak.email,phone.customer, objectcustomer.created_at,cancelled_at.note,attributes,tags,metafields.order_status_url, URL halaman status order.customer_url, URL buat pelanggan lihat order di akunnya.customer_order_url, URL halaman detail order di customer accounts baru.
2. Status
financial_status, status pembayaran:authorized,expired,paid,partially_paid,partially_refunded,pending,refunded,unpaid,voided.financial_status_label, versi terjemahannya buat ditampilin.fulfillment_status, status pengiriman:complete,fulfilled,partial,restocked,unfulfilled.fulfillment_status_label, versi terjemahannya.cancelled,truekalau dibatalkan.cancel_reasondancancel_reason_label.pickup_in_store?,truekalau order ambil di toko.
Selalu tampilin versi _label, bukan nilai mentahnya, biar otomatis sesuai bahasa pelanggan.
❌ salah, nampilin partially_paid ke pelanggan
{{ order.financial_status }}✅ benar, udah diterjemahin
{{ order.financial_status_label }}3. Item dan Alamat
line_items, arrayline_item.subtotal_line_items, baris tanpa tip, dipakai buat ngitung subtotal.item_count.shipping_addressdanbilling_address, objectaddress.shipping_methods, arrayshipping_method.
4. Harga
line_items_subtotal_price, total baris setelah diskon per baris.subtotal_price, subtotal setelah diskon baris dan keranjang.shipping_price, ongkir.tax_price, total pajak.total_duties, total bea masuk.total_discounts, total diskon.total_price, total order, dihitung sebelum refund.total_refunded_amount, yang udah dikembalikan.total_net_amount, total dikurangi refund. Pakai ini kalau mau nampilin “yang benar-benar dibayar”.tax_lines, arraytax_line.discount_applicationsdancart_level_discount_applications.discountsdeprecated.transactions, arraytransaction.
Object Pendukung Order
1. fulfillment
Satu pengiriman (satu order bisa dikirim beberapa kali):
created_at.fulfillment_line_items, baris yang ada di pengiriman ini.item_count.tracking_company, nama kurir.tracking_numberdantracking_numbers(kalau lebih dari satu resi).tracking_url, link lacak.
2. shipping_method
Metode pengiriman:
id,title,handle(handle-nya ditambahin harganya di belakang).original_price, ongkir sebelum diskon.price_with_discounts, ongkir setelah diskon termasuk diskon level order.pricedeprecated karena gak termasuk diskon order.discount_allocationsdantax_lines.
3. tax_line
Satu baris pajak: title, price (jumlah pajak), rate (desimal, misalnya 0.11), dan rate_percentage (11).
4. transaction
Satu transaksi pembayaran:
id,name,amount,created_at.kind, jenisnya (authorization, capture, sale, void, refund).statusdanstatus_label(terjemahannya).gateway, nama provider dalam bentuk handle.gateway_display_name, nama provider buat ditampilin.receipt, info struk dari provider.payment_details, objecttransaction_payment_detailsdengancredit_card_company,credit_card_last_four_digits,credit_card_number(udah disamarkan), dangift_card.show_buyer_pending_payment_instructions?,truekalau transaksinya tertunda dan pembeli harus nyelesaiin pembayaran di luar (transfer bank, gerai).buyer_pending_payment_notice, pesan instruksinya.buyer_pending_payment_instructions, arraypending_payment_instruction_inputberisi pasanganheaderdanvalue(misalnya “Entity” dan “Reference” buat Multibanco).
Pola nampilin instruksi bayar:
{% for transaction in order.transactions %}
{% if transaction.show_buyer_pending_payment_instructions? %}
<p>{{ transaction.buyer_pending_payment_notice }}</p>
{% for instruction in transaction.buyer_pending_payment_instructions %}
<p>{{ instruction.header }}: {{ instruction.value }}</p>
{% endfor %}
{% endif %}
{% endfor %}Object Diskon
Ada tiga object diskon, dan yang penting dipahami: discount_application itu diskonnya, discount_allocation itu penerapannya ke item tertentu. Satu diskon “10% semua produk” (application) bisa nempel ke lima baris berbeda (lima allocation).
1. discount_application
title, nama diskon yang dilihat pelanggan (kode kupon atau nama diskon otomatis).type, asalnya:automatic,discount_code,manual, atauscript.valuedanvalue_type, nilai dan jenisnya (persen atau nominal).target_type, kena ke apa: baris item atau ongkir.target_selection, cara milih targetnya (semua, eksplisit, atau berhak).total_allocated_amount, total nominal diskon ini.
Pola nampilin diskon di keranjang:
{% for discount_application in cart.cart_level_discount_applications %}
<p>{{ discount_application.title }}: -{{ discount_application.total_allocated_amount | money }}</p>
{% endfor %}2. discount_allocation
amount, nominal potongan di item ini.discount_application, diskon yang menyebabkannya.
3. discount (Deprecated)
Object lama dengan title / code (sama), amount / total_amount (sama), savings / total_savings (nilai negatif), dan type. Deprecated karena gak nyakup semua jenis diskon. Pakai discount_application.
Bahasan cara nampilin diskon lengkap di 42 Harga Diskon, Currency, Unit Pricing, Installments, B2B.
gift_card
Gift card. Tersedia di template gift_card.liquid dan lewat transaction_payment_details.gift_card:
code, kode penukaran. Hati-hati nampilin ini, cuma di halaman gift card milik pembelinya.last_four_characters, 4 karakter terakhir kode, aman ditampilin.balance, sisa saldo.initial_value, nilai awal.currency, kode ISO mata uang.enabled,expired,expires_on.customer,product,variant,properties.recipient, object denganname,email,nicknamekalau gift card dikirim ke orang lain.message, pesan personal buat penerima.send_on, tanggal terjadwal pengiriman.url, URL buat lihat gift card (di domaincheckout.shopify.com).pass_url, URL download sebagai Apple Wallet Pass.qr_identifier, string buat bikin QR code.template_suffix.
Bahasannya di 24 Template per Halaman dan 41 Produk Recommendations, Gift Card, dan Bundles.
checkout
Object checkout itu warisan dari checkout.liquid yang udah dihentikan. Sejak 13 Agustus 2024, halaman Information, Shipping, dan Payment gak bisa lagi dikustomisasi lewat Liquid, harus pakai Checkout Extensibility. Object ini masih ada buat halaman Thank you dan Order status di toko yang belum migrasi.
Propertinya mirip gabungan cart dan order: line_items, total_price, shipping_address, billing_address, shipping_method, tax_lines, transactions, discount_applications, applied_gift_cards, gift_cards_amount, buyer_accepts_marketing, customer, order, order_id, order_name, order_number, dan sebagainya. Banyak propertinya udah deprecated.
Catatan: order gak tersedia di halaman Thank you (karena ordernya baru dibikin), makanya di sana pakai checkout.order_name.
Detail checkout.liquid ada di 34 checkout.liquid (deprecated). Buat theme baru, kamu gak bakal nyentuh object ini.
Ringkasan
cartglobal, punyaitems(arrayline_item),item_count(jumlah kuantitas), danempty?.- Harga keranjang berurutan:
original_total_price→items_subtotal_price→total_price, dengantotal_discountsebagai selisihnya, dancheckout_charge_amountbuat yang bayarnya sebagian. cart.notecuma boleh satu di halaman, dan atribut berawalan__jadi privat dan gak kebaca Liquid.line_itempunya empat harga:original_price/final_price(per unit) danoriginal_line_price/final_line_price(per baris).price,line_price,total_discountdeprecated.- Properti baris ditangkap pakai
properties[nama]di form produk, dan nama berawalan_disembunyiin dari checkout. url_to_removebikin tombol hapus tanpa JavaScript.customerglobal cuma kalau login, kalau nggaknil.has_accountbisatruetanpa login di checkout.customer.ordersdanaddressesbisa di-paginate,last_ordergak termasuk order tes.- B2B:
customer.b2b?,current_company,current_location, dancompany_location.url_to_set_as_currentbuat ganti lokasi. order.confirmation_numberboleh ditampilin sebagai ganti nomor urut biar volume penjualan gak bocor.- Selalu tampilin
financial_status_labeldanfulfillment_status_label, bukan nilai mentahnya. total_pricedihitung sebelum refund,total_net_amountsesudahnya.discount_applicationitu diskonnya,discount_allocationitu penerapannya ke item. Objectdiscountdeprecated.transaction.show_buyer_pending_payment_instructions?buat nampilin instruksi bayar offline.gift_card.codesensitif, tampilinlast_four_characterskecuali di halaman gift card pemiliknya.checkoutitu warisancheckout.liquidyang udah dihentikan, jangan dipakai di theme baru.
Bab selanjutnya kita tutup bahasan object dengan sisanya: section, block, dan app buat arsitektur theme, form dan form_errors buat form, paginate, filter buat storefront filtering, search dan predictive_search, plus object-object robots.txt.