Di 22 Layouts kita punya bingkainya. Sekarang isinya: template, yang nentuin apa yang tampil di tiap jenis halaman.
Tiap jenis halaman di toko punya tipe template yang terkait. Mau ngerender halaman produk? Theme harus punya minimal satu template bertipe product. Mau ngerender halaman metaobject? Butuh template metaobject/{tipe}, misalnya metaobject/book atau metaobject/author.
Template itu tempat nambahin fungsi yang masuk akal buat jenis halaman itu. Rekomendasi produk di template produk, form komentar di template artikel. Dan kamu bisa bikin beberapa versi dari tipe yang sama (alternate template) buat kasus berbeda: template produk khusus pakaian, template halaman khusus yang ada videonya.
JSON vs Liquid
Ada dua jenis file template, dan ini keputusan pertama yang harus kamu ambil:
- JSON (
.json), file data yang berisi daftar section yang mau dirender. Section bisa ditambah, dihapus, dan diurutin merchant lewat theme editor. Semua HTML dan Liquid harus ada di dalam section yang dirujuk template. - Liquid (
.liquid), file markup yang bisa langsung berisi Liquid dan HTML. Gak bisa pakai section.
Aturan milihnya sederhana: kalau mau pakai section, harus JSON. Dan hampir selalu kamu mau pakai section, karena:
- Merchant bisa nambah, ngehapus, dan ngurutin section, termasuk section dari app.
- Data disimpan di template-nya sendiri, bukan numpuk di
settings_data.json. Ini bikin theme editor lebih cepat.
Jadi di theme modern, hampir semua template itu JSON. Liquid template cuma buat kasus khusus yang dibahas di bawah.
❌ kurang bagus, template Liquid buat halaman yang merchant pengen atur section-nya
templates/index.liquid✅ benar
templates/index.jsonSatu tipe cuma boleh punya satu jenis file. Kalau product.liquid udah ada, kamu gak bisa bikin product.json. Harus hapus yang lama dulu. Ini yang jadi inti migrasi Online Store 2.0 di 52 Online Store 2.0 dan Migrasinya.
Semua Tipe Template
Gak ada tipe yang wajib, tapi tiap jenis halaman yang mau dirender butuh template yang cocok. Batasnya 1.000 template JSON per theme di semua tipe: 20 template produk + 10 halaman + 5 koleksi = 35, sisa 965.
index, halaman depan di URL root/.product, halaman produk: media, konten, dan form buat milih varian dan nambah ke keranjang.collection, halaman koleksi yang ngelist produk di dalamnya.list-collections, halaman daftar semua koleksi di/collections.cart, halaman/cartdengan isi keranjang.search, halaman/searchdengan hasil pencarian.page, halaman statis kaya About us dan Contact us.blog, halaman blog yang ngelist semua artikelnya.article, halaman artikel dengan isi lengkap dan komentar opsional.404, halaman kalau URL-nya gak valid.password, halaman/passwordwaktu toko dikunci. Berisi pesan yang bisa diedit merchant dan form password.gift_card.liquid, halaman gift card yang dilihat pelanggan setelah beli. Wajib Liquid.metaobject, halaman metaobject kaya “artis” atau “penulis”. Definisi metaobject-nya harus punya web page capability.robots.txt.liquid, filerobots.txtdi/robots.txtbuat mesin pencari. Wajib Liquid.agents.md.liquid, fileagents.mddi/agents.md, deskripsi toko buat AI agent biar tau cara nemuin dan bertransaksi. Wajib Liquid.llms.txt.liquiddanllms-full.txt.liquid, di/llms.txtdan/llms-full.txt, URL alternatif buat AI agent yang bawaannya nyerminin/agents.md. Wajib Liquid.
Lima yang wajib Liquid (gift_card, robots.txt, agents.md, llms.txt, llms-full.txt) itu karena outputnya bukan halaman HTML biasa yang butuh section. Sisanya bebas JSON atau Liquid. Tiap tipe dibedah di 24 Template per Halaman dan 25 Template Spesial robots.txt, llms.txt, agents.
Template Akun Pelanggan Lama
Ada satu kelompok yang deprecated: template customers/* (customers/account, customers/activate_account, customers/login, customers/order, customers/register, customers/reset_password, customers/addresses). Akun pelanggan sekarang jalan terpisah dari theme, dan template-template ini gak perlu lagi ada.
Yang menarik: publish theme tanpa template-template ini otomatis nge-upgrade merchant ke customer accounts baru. Sebagai gantinya, tambahin komponen <shopify-account> di header biar pelanggan bisa login tanpa ninggalin toko. Bahasannya di 46 Customer Sign-in, Account Component, Contact Form, Email Consent.
Kamu masih bakal nemuin folder templates/customers/ di theme lama, dan form-form akun di 12 Tags Khusus Theme > 5. Form Akun Pelanggan masih jalan di situ. Tapi buat theme baru, lewati aja.
Lokasi
└── theme
├── layout
├── templates
| ├── 404.json
| ├── article.json
| ...
...Template JSON
Template JSON itu file data berisi daftar section yang mau dirender beserta setting-nya. Waktu halaman dirender, section-section itu dirender sesuai urutan di atribut order, tanpa markup apapun di antaranya.
Batasnya: 25 section per template, dan 50 block per section.
Prinsip pentingnya: waktu bikin template JSON, kamu juga harus bikin section yang berisi fungsi inti template itu. Template list-collections harus ngerujuk section yang pakai object collections. Template product harus ngerujuk section yang punya object product dan form produk. Template JSON-nya sendiri gak bisa ngapa-ngapain, dia cuma daftar.
1. Schema
Isinya harus object dengan atribut-atribut ini:
layout(string ataufalse, opsional), nama file layout tanpa ekstensi."full-width"ngerenderlayout/full-width.liquid. Bawaannyatheme.liquid.falsebuat tanpa layout, tapi template tanpa layout gak bisa dikustomisasi di theme editor.wrapper(string, opsional), elemen HTML pembungkus semua section. Dibahas di bawah.sections(object, wajib), object dengan ID section sebagai kunci dan data section sebagai nilai. Minimal satu section, dan ID gak boleh duplikat.order(array, wajib), array ID section sesuai urutan render. Semua ID harus ada disections, dan gak boleh duplikat.
Contoh lengkap template produk:
{
"sections": {
"main": {
"type": "product",
"settings": {
"show_vendor": true
}
},
"recommendations": {
"type": "product-recommendations"
}
},
"order": [
"main",
"recommendations"
]
}Ini ngerender sections/product.liquid dengan setting show_vendor = true, diikuti sections/product-recommendations.liquid.
Semua section yang dirujuk (kecuali app section) harus ada di theme. Kalau nggak, error.
❌ salah, ID recommendations ada di order tapi gak ada di sections
{
"sections": {
"main": { "type": "product" }
},
"order": ["main", "recommendations"]
}✅ benar
{
"sections": {
"main": { "type": "product" },
"recommendations": { "type": "product-recommendations" }
},
"order": ["main", "recommendations"]
}2. Penamaan
Nama file harus tipe template yang valid, dengan akhiran opsional buat alternate template: product.json atau product.alternate.json.
3. Section Data
Format data tiap section di dalam sections:
sections: {
<SectionID>: {
"type": <SectionType>,
"disabled": <SectionDisabled>,
"settings": {
<SettingID>: <SettingValue>
},
"blocks": {
<BlockID>: {
"type": <BlockType>,
"settings": {
<SettingID>: <SettingValue>
}
}
},
"block_order": <BlockOrder>
}
}Penjelasannya:
<SectionID>, ID unik section, cuma alfanumerik.type(wajib), nama file section tanpa ekstensi.disabled(opsional), kalautruesection-nya gak dirender tapi masih bisa dikustomisasi di theme editor. Ini yang terjadi waktu merchant klik “sembunyikan section”. Bawaannyafalse.settings, pasangan ID setting dan nilainya, sesuai schema section.blocks, object dengan ID block (alfanumerik) sebagai kunci, tiap-tiapnya punyatype(sesuai schema section) dansettings.block_order, array ID block sesuai urutan. Harus ada diblocks, gak boleh duplikat.
Formatnya sama persis dengan data section di settings_data.json yang dibahas di 32 Config settings_schema.json, settings_data.json, markets.json. Dan data section gak bisa dibagi antar template: tiap template punya data section-nya sendiri, jadi ID section cukup unik di dalam template itu.
Section bisa ditambahin ke template lewat kode (edit JSON-nya) atau lewat theme editor. Section mana yang muncul di theme editor bisa dibatasi pakai atribut enabled_on atau disabled_on di schema section. Kalau gak ada, section bisa ditambahin ke template manapun. Bahasannya di 26 Sections dan Section Schema.
Satu syarat penting: section harus punya presets di schema-nya biar bisa ditambahin lewat theme editor. Section tanpa preset harus ditulis manual di JSON, dan gak bisa dihapus merchant dari theme editor. Ini berguna buat section inti (kaya main-product) yang emang gak boleh dihapus.
4. Wrapper
Atribut wrapper nyisipin tag HTML di sekeliling semua section template. Cuma boleh <div>, <main>, atau <section>, dengan sintaks mirip selector CSS:
{
"wrapper": "div#div_id.div_class[attribute-one=value]",
"sections": {
"main": {
"type": "product"
}
},
"order": [
"main"
]
}Hasilnya:
<div id="div_id" class="div_class" attribute-one="value">
<!-- product.json sections -->
</div>Berguna kalau kamu butuh satu pembungkus buat grid atau padding tanpa harus nambahin di tiap section.
5. Setting yang Dikontrol Platform
Di theme editor, Shopify nyediain setting custom CSS di level theme dan section. CSS yang ditulis merchant di situ disimpan di atribut custom_css di data section.
Ini bukan buat developer. Jangan nambahin setting ini sendiri, dan jangan ngedit nilainya setelah diset merchant. Buat kustomisasi CSS dari sisi developer, pakai file CSS di assets/ dan tag stylesheet, terus sediain opsi kustomisasinya lewat theme settings.
Template Liquid
Template Liquid itu file .liquid yang langsung berisi HTML dan Liquid, gak punya schema tetap, dan gak bisa pakai section. Bisa akses semua object global plus object yang terkait template-nya (product di template produk, dan seterusnya).
Kegunaan utamanya sekarang:
- Lima template yang wajib Liquid (
gift_card,robots.txt,agents.md,llms.txt,llms-full.txt). - Theme lama yang belum migrasi ke JSON.
- Kasus khusus di mana kamu butuh layout yang beda total buat halaman tertentu dan merchant gak perlu ngatur apa-apa.
Dulu template Liquid dipakai buat bikin tampilan produk yang beda-beda (semua pakaian pakai template ini, semua elektronik pakai itu). Sekarang itu dilakuin pakai alternate template JSON yang section-nya beda.
Alternate Template
Kadang kamu butuh markup berbeda buat tipe template yang sama. Misalnya template produk khusus yang punya section tambahan buat produk tertentu. Itu alternate template.
Bisa dibikin secara lokal, lewat code editor, atau lewat theme editor. Tapi ada aturan: template default gak bisa diganti sama alternate. Kalau template default gak sesuai, ya edit template default-nya.
1. Penamaan
template-name.template-suffix.template-file-typeAlternate template produk bernama alternate dalam JSON:
product.alternate.jsonDan template.suffix dari 13 Objects Global > template bakal berisi alternate.
2. Cara Pakai
Setelah dibikin, alternate template bisa diterapin dengan tiga cara:
- Ditetapkan ke sumber daya di Shopify admin. Buka produknya, di bagian Theme template pilih
alternate. Sejak itu produk itu selalu pakai template ini. - Di-preview di theme editor, buat lihat sebelum diterapin.
- Dirender lewat parameter URL
view, dibahas di bawah.
3. Parameter view
Alternate template bisa dipanggil langsung lewat URL dengan ?view=[suffix]:
/products/example-product?view=alternateIni ngerender produk itu pakai product.alternate.json tanpa harus ditetapkan di admin. Berguna buat ngetes, atau buat bikin “tampilan cetak” dan “tampilan cepat” yang diakses lewat link.
❌ salah, alternate template gak bisa ganti default, produk yang gak ditetapkan tetap pakai product.json
Hapus product.json, ganti dengan product.alternate.json, terus berharap semua produk pakai itu✅ benar, edit product.json langsung kalau mau ngubah semua produk
Edit templates/product.jsonContextual Template
Ini fitur yang lebih baru: merchant bisa nyesuaiin template buat konteks pembeli tertentu, misalnya market Kanada atau pelanggan B2B, lewat theme editor. Waktu itu dilakuin, Shopify bikin file contextual template baru dengan nama:
index.context.<context-string>.jsonIsinya cuma override (perubahan) dari template induknya, bukan salinan lengkap. Konteks dan induknya didefinisikan di atas:
{
"context": {
"market": "ca"
},
"parent": "index.json",
"sections": {
"image_banner": {
"blocks": {
"heading": {
"disabled": true,
"settings": {
"heading_size": "h2"
}
},
"settings": {
"show_text_box": true
}
}
}
}Nilai context bisa "market": "handle-market" atau "b2b": true. Contoh di atas: buat market ca, section image_banner di halaman depan punya block heading yang dimatiin dan setting show_text_box nyala. Section lain tetap ngikutin index.json.
Sebagai developer, kamu jarang nyentuh file ini langsung, karena dibikin merchant lewat theme editor. Tapi kamu harus tau ada, biar gak bingung waktu lihat file index.context.ca.json muncul di theme. Bahasannya di 47 Markets Multi Currency, Multi Bahasa, Localization.
Ringkasan
- Template JSON itu daftar section, template Liquid itu markup langsung. Mau section, harus JSON, dan hampir semua template modern JSON.
- Satu tipe cuma boleh satu jenis file.
product.liquiddanproduct.jsongak bisa hidup bareng. - 16 tipe template, lima di antaranya wajib Liquid:
gift_card,robots.txt,agents.md,llms.txt,llms-full.txt. - Template
customers/*deprecated. Publish theme tanpa itu otomatis nge-upgrade merchant ke customer accounts baru. - Batas: 1.000 template JSON per theme, 25 section per template, 50 block per section.
- JSON template wajib punya
sectionsdanorder, opsionallayout(ataufalse) danwrapper. - Semua ID di
orderharus ada disections, semuatypeharus ada file section-nya, kecuali app section. disabled: truenyembunyiin section tapi tetap bisa diedit.- Section butuh
presetsbiar bisa ditambahin lewat theme editor, tanpa preset harus ditulis manual dan gak bisa dihapus merchant. custom_cssitu setting platform, jangan ditambahin atau diedit developer.- Alternate template dinamai
tipe.suffix.json, diterapin di admin, atau dipanggil pakai?view=suffix. Gak bisa ganti template default. - Contextual template
index.context.<konteks>.jsonberisi override per market atau B2B, dibikin merchant lewat theme editor.
Bab selanjutnya kita bedah tiap tipe template satu-satu: apa yang harus ada di halaman produk, koleksi, keranjang, blog, dan lainnya, beserta form dan object yang dipakai di masing-masing.