Dampak awal: blank putih atau error 500 tepat setelah ganti versi PHP
- Halaman benar-benar putih, tanpa teks apa pun.
- Error 500 dari web server.
- Pesan critical error dari WordPress, karena sejak versi 5.2 WordPress punya fatal error handler sendiri.
- Halaman depan normal, tapi wp-admin blank. Ini terjadi kalau kode yang rusak hanya dimuat di area admin.
Investigasi: kenapa layar kosong tidak memberi petunjuk
define( 'WP_DEBUG', false );. Kalau baris itu sudah ada, ubah nilainya, jangan menduplikasi define-nya. Lalu tambahkan sisanya sebelum komentar /* That's all, stop editing! */:
PHP
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );WP_DEBUGmenyalakan mode debug.WP_DEBUG_LOGmenyuruh WordPress menulis semua error ke filewp-content/debug.log.WP_DEBUG_DISPLAYyang diset false danini_setmemastikan error tidak tampil di halaman.
WP_DEBUG_LOG juga bisa diisi path file di luar public_html sebagai pengganti true, dan itu pilihan yang lebih aman kalau debug perlu menyala lebih lama.
Titik terang: satu baris Fatal error di debug.log
PHP Fatal error, karena hanya fatal error yang menghentikan eksekusi.
Contoh format output (bukan dari insiden nyata):
TEXT
[tanggal waktu UTC] PHP Fatal error: Uncaught Error: Call to undefined function create_function() in /home/contoh/public_html/wp-content/plugins/plugin-lama/includes/widget.php:42
Stack trace:
#0 /home/contoh/public_html/wp-includes/class-wp-hook.php(...): ...wp-content/plugins/ adalah nama folder plugin penyebabnya, di contoh ini plugin-lama. Kalau path-nya mengarah ke wp-content/themes/, berarti pelakunya theme. Kalau mengarah ke wp-content/mu-plugins/, itu must-use plugin, dan penanganannya sedikit berbeda.
Pesan errornya juga menjelaskan kenapa kode itu rusak di PHP 8. Call to undefined function untuk fungsi seperti create_function(), each(), atau money_format() berarti fungsinya sudah dihapus sejak PHP 8.0. Ada juga pola lain: TypeError dari fungsi seperti count() yang menerima nilai bukan array. Di PHP 7 itu hanya warning, sedangkan di PHP 8 eksekusi langsung berhenti. Kode lama yang dulu jalan dengan banyak warning sekarang langsung mati.
Kalau ada beberapa fatal error, fokus ke yang paling baru dan muncul berulang tiap kali halaman dibuka. Fatal error lama bisa saja sisa dari kondisi sebelumnya.
Mitigasi sementara: matikan plugin tanpa masuk wp-admin
BASH
# lihat beberapa fatal error terakhir
grep -n 'PHP Fatal error' wp-content/debug.log | tail -n 5
# cek plugin aktif tanpa memuat plugin dan theme
wp plugin list --status=active --skip-plugins --skip-themes
# nonaktifkan plugin penyebab
wp plugin deactivate plugin-lama --skip-plugins --skip-themes
# alternatif tanpa WP-CLI: rename folder plugin
mv wp-content/plugins/plugin-lama wp-content/plugins/plugin-lama.nonaktif--skip-plugins dan --skip-themes itu penting. Tanpa keduanya, WP-CLI memuat WordPress lengkap dengan plugin yang rusak, sehingga perintahnya ikut kena fatal error.
Cara rename folder bisa dipakai kalau WP-CLI tidak tersedia, cukup lewat File Manager atau SFTP. WordPress tidak menemukan file plugin di path lamanya, lalu otomatis menganggapnya nonaktif. Kalau nanti folder dikembalikan ke nama asal, plugin tetap dalam kondisi nonaktif sampai diaktifkan lagi secara manual.
Penanganan untuk dua kasus lain:
- Kalau pelakunya theme, aktifkan theme lain yang sudah terpasang. Cek daftarnya dengan
wp theme list --skip-plugins --skip-themes, lalu jalankanwp theme activatedengan nama theme tersebut. - Kalau pelakunya mu-plugins, perintah deactivate tidak berpengaruh, karena must-use plugin selalu dimuat. Satu-satunya jalan adalah memindahkan atau me-rename file-nya.
Perbaikan permanen: upgrade PHP lewat staging, bukan langsung di produksi
- Update plugin ke versi terbaru, karena bisa jadi masalahnya sudah diperbaiki developernya.
- Ganti dengan plugin lain kalau plugin lama sudah lama tidak di-update.
- Perbaiki kodenya sendiri kalau itu kode custom.
- Salin situs ke staging.
- Jalankan staging di versi PHP target.
- Nyalakan
WP_DEBUG_LOG. - Klik halaman-halaman utama, termasuk wp-admin, form, dan checkout kalau ada.
- Baca debug.log-nya.
WP_DEBUG ke false, lalu hapus atau pindahkan debug.log. Log yang dibiarkan menyala terus akan membengkak oleh Deprecated dan Notice, dan bisa terbuka ke publik.
Intinya, layar putih setelah upgrade PHP hampir selalu meninggalkan jejak berupa satu baris Fatal error. Nyalakan log tanpa menampilkan error ke pengunjung, cari path di baris itu, lalu matikan plugin yang ditunjuk lewat WP-CLI atau rename folder. Setelah situs kembali normal, perbaiki prosesnya: tes versi PHP baru di staging dulu, supaya upgrade berikutnya tidak berubah jadi sesi debugging di produksi.