Structured Data menengah
JSON-LD untuk SEO
JSON-LD memisahkan data dari tampilan, sehingga satu template bisa menghasilkan markup yang konsisten untuk ribuan halaman. Bagian yang jarang dijelaskan: cara menghubungkan beberapa entitas dalam satu graf dengan @id, supaya penulis, situs, dan artikel tidak dideklarasikan berulang-ulang dengan versi yang saling berbeda.
JSON-LD (JavaScript Object Notation for Linked Data) adalah format untuk menulis structured data sebagai objek JSON di dalam tag <script type="application/ld+json">, terpisah dari HTML tampilan. Google merekomendasikannya di atas Microdata dan RDFa karena lebih mudah dibuat, dibaca, dan diubah tanpa menyentuh markup halaman.
Bentuk dasar
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Canonical Tag",
"author": { "@type": "Person", "name": "Ahmad Safwan", "url": "https://www.masahmadsafwan.com/author/ahmad-safwan/" },
"datePublished": "2026-09-15T08:00:00+07:00",
"dateModified": "2026-09-15T08:00:00+07:00"
}
</script>Tiga kunci yang selalu ada: @context (vocabulary yang dipakai, hampir selalu https://schema.org), @type (tipe entitas), dan properti sesuai tipe. Blok ini boleh ditaruh di <head> atau <body>; Google membaca keduanya, termasuk yang disisipkan JavaScript setelah render (tapi lebih aman di HTML server).
Pola @graph dan @id
Halaman nyata biasanya punya beberapa entitas: situs, penulis, artikel, breadcrumb. Menulisnya sebagai objek terpisah yang saling mengulang (penulis dideklarasikan penuh di Article dan lagi di WebSite) rawan tidak konsisten. Pola yang lebih rapi: satu blok dengan @graph berisi semua entitas, tiap entitas punya @id unik, dan entitas lain merujuknya dengan {"@id": "..."}.
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebSite",
"@id": "https://www.example.com/#website",
"name": "Nama Situs",
"url": "https://www.example.com/",
"inLanguage": "id",
"publisher": { "@id": "https://www.example.com/author/nama/#person" }
},
{
"@type": "Person",
"@id": "https://www.example.com/author/nama/#person",
"name": "Nama Penulis",
"url": "https://www.example.com/author/nama/"
},
{
"@type": "WebPage",
"@id": "https://www.example.com/technical-seo/canonical/#page",
"url": "https://www.example.com/technical-seo/canonical/",
"name": "Canonical Tag",
"isPartOf": { "@id": "https://www.example.com/#website" }
},
{
"@type": "Article",
"@id": "https://www.example.com/technical-seo/canonical/#article",
"headline": "Canonical Tag",
"author": { "@id": "https://www.example.com/author/nama/#person" },
"publisher": { "@id": "https://www.example.com/author/nama/#person" },
"datePublished": "2026-09-15T08:00:00+07:00",
"dateModified": "2026-09-15T08:00:00+07:00",
"mainEntityOfPage": { "@id": "https://www.example.com/technical-seo/canonical/#page" },
"image": ["https://www.example.com/assets/og/canonical.png"]
},
{
"@type": "BreadcrumbList",
"@id": "https://www.example.com/technical-seo/canonical/#breadcrumb",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Beranda", "item": "https://www.example.com/" },
{ "@type": "ListItem", "position": 2, "name": "Technical SEO", "item": "https://www.example.com/technical-seo/" },
{ "@type": "ListItem", "position": 3, "name": "Canonical Tag" }
]
}
]
}Aturan @id: harus berupa IRI (URL) yang unik dan sama persis di semua halaman untuk entitas yang sama. Penulis dengan @id .../author/nama/#person di semua artikel memberi tahu sistem bahwa itu satu orang, bukan seratus orang bernama sama. Nilai setelah # bebas; #person, #website, #page hanya konvensi.
Properti yang sering salah
| Properti | Kesalahan umum | Yang benar |
|---|---|---|
datePublished | Tanggal tanpa zona waktu, atau format lokal ("15/09/2026") | ISO 8601 dengan zona waktu: 2026-09-15T08:00:00+07:00 |
dateModified | Diisi tanggal build/hari ini di semua halaman | Hanya berubah saat isi berubah; harus sama dengan tanggal yang tampil di halaman |
author.name | "Tim Redaksi PT X" atau "Admin", atau nama plus jabatan | Nama orang atau organisasi saja; Google secara eksplisit meminta tanpa jabatan atau gelar |
author.url / sameAs | Dikosongkan, atau diisi URL beranda | URL halaman profil penulis; sameAs ke profil eksternal hanya kalau benar-benar milik penulis |
image | Satu gambar kecil, atau URL relatif | URL absolut, resolusi tinggi; Google menyarankan beberapa rasio (16:9, 4:3, 1:1) |
publisher | Organization dengan nama situs padahal tidak ada organisasi | Person atau Organization yang benar-benar ada; keduanya diterima Google untuk Article |
headline | Berbeda jauh dari H1, atau berisi nama situs | Judul artikel, ringkas |
url di WebPage | URL dengan parameter atau tanpa garis miring akhir yang berbeda dari canonical | Sama persis dengan canonical |
Yang tidak perlu dilakukan
- Menyalin semua properti Schema.org. Google hanya memakai properti yang ia dokumentasikan per tipe. Properti lain tidak salah, tapi tidak menghasilkan apa pun.
- Menambahkan
aggregateRatingtanpa ulasan nyata di halaman. Ini pelanggaran pedoman yang paling sering kena tindakan manual. - FAQPage di setiap halaman. Vocabulary-nya valid, tapi Google tidak lagi menampilkan rich result-nya sejak Mei 2026.
- Beberapa blok JSON-LD yang saling bertentangan (plugin SEO + tema + plugin lain, masing-masing mendeklarasikan Article dengan nilai berbeda). Google mencoba menggabungkan, hasilnya tidak terduga. Satu sumber saja.
- Markup pada halaman noindex. Tidak ada gunanya.
Cara memvalidasi dan melihat apa yang Google baca
- Validasi sintaksTempel JSON ke validator JSON biasa dulu; satu koma salah membuat seluruh blok diabaikan tanpa peringatan di halaman.
- Rich Results TestMasukkan URL atau kode. Baca error (menggugurkan syarat) dan peringatan (properti direkomendasikan yang kosong). Untuk tipe yang tidak didukung Google, alat ini hanya menampilkan "tidak ada rich result", bukan error.
- Schema Markup ValidatorUntuk memeriksa vocabulary tipe apa pun terhadap Schema.org.
- URL InspectionSetelah Google meng-crawl, bagian Enhancements menunjukkan apa yang Google deteksi dari versi tersimpan. Kalau tidak muncul padahal ada di halaman, kemungkinan disisipkan JavaScript yang gagal, atau JSON tidak valid.
- Search Console → EnhancementsPantau error di seluruh situs setelah perubahan template.
Menghasilkan JSON-LD dari template
Untuk situs statis atau CMS, buat JSON-LD dari data halaman (judul, tanggal, penulis, breadcrumb) dengan satu fungsi, lalu JSON.stringify. Keuntungannya: tidak mungkin ada koma yang hilang, @id pasti konsisten, dan mengubah struktur entitas cukup di satu tempat. Yang perlu diperhatikan saat menyisipkan ke HTML: karakter </script> di dalam string JSON harus di-escape (misalnya jadi <\/script>) supaya tidak menutup tag lebih awal.
Rujukan
- Structured data general guidelines: format Google Search Central
- Article structured data Google Search Central
- Breadcrumb structured data Google Search Central
- Profile page structured data Google Search Central
- JSON-LD 1.1 specification W3C
- Rich Results Test Google