D
P
0

WordPress & PHP

wp-admin Bertingkah Aneh (Nonce Kadaluarsa, AJAX Bukan JSON, Sidebar Hilang)? Itu CDN/Edge Cache, Bukan Bug Tema

25 Juni 2026·3 menit baca
wp-admin Bertingkah Aneh (Nonce Kadaluarsa, AJAX Bukan JSON, Sidebar Hilang)? Itu CDN/Edge Cache, Bukan Bug Tema

Klien saya melaporkan wp-admin yang "kerasukan". Daftar tema dan plugin di dashboard menampilkan data lama yang sudah tidak relevan. Saat menyimpan sesuatu, WordPress melempar error nonce klasik:

The link you followed has expired.

Lalu ada panel custom yang memanggil admin-ajax dan tiba-tiba gagal total. Di console browser, JS-nya berteriak karena respons yang seharusnya JSON malah datang sebagai HTML:

// JS frontend admin yang mengharapkan JSON
fetch(ajaxurl, { method: 'POST', body: data })
  .then(function (res) { return res.json(); })
  .catch(function (err) {
    // Uncaught (in promise) SyntaxError:
    // Unexpected token '<', "<!DOCTYPE "... is not valid JSON
    console.error(err);
  });

Dan yang paling bikin merinding: sidebar admin kadang muncul, kadang hilang. Di halaman yang sama. Hanya dengan refresh. Saya menghabiskan waktu cukup lama mengejar bug tema dan plugin. Padahal kode aplikasinya baik-baik saja.

Kenapa ini terjadi

Penyebabnya bukan di tema, bukan di plugin, dan bukan di PHP saya. Penyebabnya ada di lapisan yang sama sekali tidak saya curigai di awal: CDN / edge cache. Tepatnya, page rules Cloudflare yang terlalu agresif ikut menyimpan respons /wp-admin/ dan /wp-admin/admin-ajax.php di cache edge.

Begitu Anda paham mekanismenya, semua gejala "hantu" tadi jadi masuk akal:

  • Daftar tema/plugin basi. Halaman admin disajikan dari cache edge, jadi Anda melihat snapshot lama, bukan kondisi instalasi yang sekarang.
  • Nonce "link expired". Nonce di WordPress terikat pada user dan waktu. Kalau halaman yang berisi nonce di-cache lalu disajikan ulang ke request berikutnya, nonce itu sudah basi (atau milik konteks user lain) begitu sampai ke server. Hasilnya: link expired.
  • admin-ajax mengembalikan HTML, bukan JSON. Edge menyajikan respons HTML yang ter-cache untuk endpoint yang seharusnya menghasilkan JSON dinamis. JS yang memanggil res.json() langsung pecah karena yang datang <!DOCTYPE html>.
  • Sidebar hilang lalu muncul lagi. Inilah petunjuk terbesar. Anda tertabrak campuran antara hit dan miss cache. Beberapa fragmen HTML datang dari cache, beberapa fresh, dan keduanya tidak konsisten satu sama lain antar reload.

Tanda khasnya: keanehannya berubah setiap reload dan berbeda per URL. Bug kode yang sesungguhnya itu deterministik — input yang sama menghasilkan kegagalan yang sama. Ini tidak. Dan satu eksperimen menutup kasusnya: hard refresh atau bypass cache, dan semuanya hilang. Kalau melewati cache menyembuhkan masalah, masalahnya ada di cache, bukan di aplikasi Anda.

Ada bahaya tersembunyi di sini juga. Meng-cache respons logged-in dan menyajikannya ke request lain itu bukan cuma bug tampilan — itu bisa membocorkan konten satu user ke user lain. Untuk area admin, ini langsung jadi masalah keamanan, bukan sekadar gangguan.

Perbaikannya

Aturannya sederhana: /wp-admin/ dan /wp-admin/admin-ajax.php tidak boleh pernah di-cache di edge. Begitu juga request dari user yang sudah login. WordPress sudah menandai sesi login lewat cookie, jadi keberadaan cookie itulah yang harus saya jadikan sinyal untuk bypass cache sepenuhnya.

Di Cloudflare, perbaikannya berarti membuat rule yang membypass cache untuk path admin, dan memastikan cookie login WordPress mematahkan cache. Secara konsep, rule-nya seperti ini:

# Path admin: jangan pernah di-cache di edge
URL match: *old-site.com/wp-admin/*
  -> Cache Level: Bypass
 
URL match: *old-site.com/wp-admin/admin-ajax.php*
  -> Cache Level: Bypass
 
# Bypass juga setiap request yang membawa cookie login WordPress
Cookie contains: wordpress_logged_in_
  -> Cache Level: Bypass

Kalau Anda lebih suka level web server, prinsipnya identik: jangan biarkan apa pun di bawah /wp-admin/ masuk ke cache yang dipakai bersama, dan jangan cache request yang membawa cookie wordpress_logged_in_. Yang penting bukan vendor atau sintaksisnya — yang penting adalah path admin dan request logged-in selalu menembus langsung ke origin.

Setelah rule itu aktif, saya jalankan satu hard refresh untuk mengusir versi basi dari edge, lalu nonce kembali valid, admin-ajax mengembalikan JSON yang benar, daftar plugin akurat lagi, dan sidebar berhenti berkedip-kedip menghilang.

Pelajaran

Kalau wp-admin bertingkah tidak konsisten — beda per halaman, berubah antar reload, sembuh dengan hard refresh — jangan langsung membongkar tema. Itu pola khas artefak edge-cache, bukan bug kode aplikasi. Kode aplikasi gagal secara deterministik; cache gagal secara acak.

Jadi pertanyaan pertama saya sekarang ketika admin berperilaku aneh bukan lagi "plugin mana yang bermasalah?", melainkan "stack hosting dan CDN-nya apa, dan apakah ada yang meng-cache /wp-admin/?". Diagnosis infrastrukturnya dulu sebelum tema. Sering kali jawabannya ada satu lapisan di atas kode yang sedang Anda tatap.