D
P
0

WordPress & PHP

“Di Tempat Saya Normal” — Karena Kamu Cek sebagai Admin: Render Publik vs Login Itu Beda

24 Juni 2026·4 menit baca
“Di Tempat Saya Normal” — Karena Kamu Cek sebagai Admin: Render Publik vs Login Itu Beda

Saya baru saja deploy perbaikan CSS untuk sebuah custom theme klien, lalu refresh halaman depan. Rapi. Layout-nya pas, spacing-nya benar, semua sesuai mockup. Saya tulis "fixed, sudah live" di chat, tutup laptop, selesai. Lima menit kemudian balasan masuk: "masih rusak kok di sini." Saya buka lagi, tetap normal. Dia kirim screenshot — dan memang masih rusak persis seperti sebelum saya sentuh. Tidak ada error string, tidak ada baris merah di console. Hanya dua orang melihat URL yang sama dan melihat dua halaman yang berbeda.

Yang bikin saya berhenti adalah ini: tidak ada satu pun stack trace untuk dikejar. Saya pakai trik termurah dulu — buka tab incognito, tempel URL yang sama persis.

# Tab biasa saya (login wp-admin): rapi
# Tab incognito (tanpa cookie): rusak, sama seperti screenshot klien

Dan benar saja. Di incognito, halamannya rusak. Saya sudah berjam-jam memverifikasi render yang salah.

Kenapa ini terjadi

Site ini pakai WP Rocket, dan ini perilaku default hampir semua plugin full-page cache: mereka melewati cache halaman untuk user yang login. Logikanya masuk akal — kalau kamu login, kamu mungkin admin atau editor yang butuh melihat konten draft, nonce yang fresh, atau toolbar wp-admin. Menyajikan HTML statis yang sudah di-cache ke orang seperti itu malah berisiko salah. Jadi saat saya, dalam keadaan login, request halaman depan, WP Rocket diam-diam minggir dan WordPress merender halaman itu dari awal, langsung dari PHP, dengan CSS terbaru saya.

Pengunjung yang logout dapat jalur yang sama sekali berbeda: HTML statis yang sudah di-cache, yang masih menyimpan CSS lama dari sebelum saya deploy. Cache itu belum di-bust untuk path publik. Dua jalur render, satu URL.

Ada satu lapisan lagi yang memperlebar jurang. WP Rocket punya fitur Remove Unused CSS, dan itu juga di-skip untuk user login. Jadi versi admin saya dapat stylesheet penuh, sementara publik dapat versi yang sudah dipangkas — yang kalau aturan kritisnya kepangkas, bisa kelihatan beda walaupun cache sudah fresh. Ditambah, admin bar di atas menyuntik margin-top ke <html> dan kadang offset kecil lain, jadi posisi vertikal pun tidak pernah benar-benar identik dengan apa yang dilihat publik.

Jadi tampilan admin saya: tidak di-cache, CSS penuh, ada offset admin bar. Tampilan publik: di-cache, CSS dipangkas, tanpa offset. Itu bukan halaman yang sama. "Di tempat saya normal" itu benar — secara harfiah render saya memang lain.

Perbaikannya

Perbaikan nyatanya membosankan: clear cache WP Rocket biar path publik di-build ulang dengan CSS baru saya. Tapi pelajaran yang lebih penting adalah cara verifikasi, karena di sinilah saya kepleset.

Aturan pertama dan paling sederhana: selalu verifikasi di jendela incognito / tanpa cookie. Bukan tab kamu yang biasa. Bukan "logout dulu ah" yang setengah hati lalu lupa beberapa cookie masih nempel. Jendela private yang bersih, tanpa session.

Tapi sering saya tidak mau logout — saya lagi di tengah ngerjain sesuatu di wp-admin. Buka console browser, dan diff dua render langsung dari tab yang sama:

// Render publik, di-cache (browser tetap kirim cookie, tapi kita buang)
fetch(location.href, { credentials: 'omit' }).then(r => r.text()).then(t => console.log(t.length))
 
// Render kamu yang login (cookie ikut)
fetch(location.href, { credentials: 'include' }).then(r => r.text()).then(t => console.log(t.length))

Kalau dua HTML itu beda — beda panjang, beda blok <style>, beda markup — kamu baru saja membuktikan jalur publik yang di-cache memang menyimpang dari jalur login kamu. Itu konfirmasi keras, bukan tebakan.

Kalau kamu di terminal dan ingin lebih bersih lagi, curl URL-nya tanpa cookie auth sama sekali:

# Persis seperti yang dilihat pengunjung anonim
curl -s https://old-site.com/ | grep -c 'class-yang-saya-perbaiki'
 
# WP Rocket bisa strip atau melayani beda untuk UA yang tidak dikenal,
# jadi tiru Googlebot kalau curiga ada percabangan berdasarkan UA
curl -s -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" https://old-site.com/

Tanpa cookie, kamu menabrak HTML statis persis seperti yang dapat publik. Kalau perbaikanmu tidak muncul di sini, ya berarti belum live — apa pun yang ditampilkan tab admin-mu.

Pelajaran

Render admin yang login bukan render publik. Pada site mana pun yang ada di belakang full-page cache, mereka secara harfiah adalah dua jalur kode berbeda: satu di-cache dan dipangkas dan anonim, satu lagi fresh dan penuh dan login. Memverifikasi yang login lalu mendeklarasikan kelar itu sama saja seperti mencicipi adonan lalu bilang kuenya sudah matang.

Sekarang aturan saya satu kalimat: sebelum saya bilang sesuatu sudah live, saya cek path yang di-cache, logout — incognito, credentials: 'omit', atau curl tanpa cookie. Kalau di sana sudah benar, baru beneran sudah live. Kalau tidak, yang saya perbaiki cuma rendering pribadi saya sendiri, dan pengunjung tidak pernah ikut menikmatinya.