'folder ini', '..' => 'folder induk', 'wp' => 'subfolder /wp', 'wordpress' => 'subfolder /wordpress', '..' . DIRECTORY_SEPARATOR . 'wp' => 'folder induk /wp', ); $hasil = array(); foreach ( $akar as $rel => $label ) { $dir = '' === $rel ? __DIR__ : __DIR__ . DIRECTORY_SEPARATOR . $rel; $dir = realpath( $dir ); if ( ! $dir ) { continue; } $isi = @scandir( $dir ); if ( ! $isi ) { continue; } $isi = array_diff( $isi, array( '.', '..' ) ); $hasil[] = array( 'label' => $label, 'dir' => $dir, 'wp_load' => is_file( $dir . '/wp-load.php' ), 'wp_config' => is_file( $dir . '/wp-config.php' ), 'wp_admin' => is_dir( $dir . '/wp-admin' ), 'wp_content' => is_dir( $dir . '/wp-content' ), 'wp_includes'=> is_dir( $dir . '/wp-includes' ), 'index_php' => is_file( $dir . '/index.php' ), 'htaccess' => is_file( $dir . '/.htaccess' ), 'jumlah' => count( $isi ), ); } return $hasil; } /** Membaca konstanta wp-config.php TANPA menjalankannya. */ function cw_baca_wp_config( $berkas ) { $teks = @file_get_contents( $berkas ); if ( false === $teks ) { return array(); } $hasil = array(); if ( preg_match_all( "/define\s*\(\s*['\"]([A-Z_]+)['\"]\s*,\s*'([^']*)'\s*\)/", $teks, $m, PREG_SET_ORDER ) ) { foreach ( $m as $satu ) { $hasil[ $satu[1] ] = $satu[2]; } } if ( preg_match( '/\$table_prefix\s*=\s*[\'"]([^\'"]+)[\'"]/', $teks, $t ) ) { $hasil['table_prefix'] = $t[1]; } $hasil['__panjang'] = strlen( $teks ); return $hasil; } /** Pemeriksaan isi .htaccess: pengalihan keluar, inti WordPress, duplikat. */ function cw_periksa_htaccess( $berkas ) { $hasil = array( 'ada' => false, 'teks' => '', 'catatan' => array(), 'luar' => array(), 'inti' => false ); if ( ! is_file( $berkas ) ) { return $hasil; } $hasil['ada'] = true; $teks = (string) @file_get_contents( $berkas ); $hasil['teks'] = $teks; if ( preg_match_all( '/^\s*(Redirect\w*|RedirectMatch)\s+.*(https?:\/\/[^\s]+)/im', $teks, $m, PREG_SET_ORDER ) ) { foreach ( $m as $s ) { $hasil['luar'][] = trim( $s[0] ); } } if ( preg_match_all( '/RewriteRule\s+\S+\s+(https?:\/\/[^\s]+)/i', $teks, $m2, PREG_SET_ORDER ) ) { foreach ( $m2 as $s ) { $hasil['luar'][] = trim( $s[0] ); } } if ( false !== stripos( $teks, 'RewriteRule ^index\.php$' ) || false !== stripos( $teks, 'WordPress' ) ) { $hasil['inti'] = true; } if ( preg_match_all( '/php_value|php_flag|php_admin_value/i', $teks, $m3 ) ) { $hasil['catatan'][] = 'Ada ' . count( $m3[0] ) . ' baris php_value/php_flag — di hosting dengan PHP-FPM (mis. Plesk/cPanel modern) baris ini bisa membuat ERROR 500. Bila situs 500, coba comment dulu baris itu.'; } if ( preg_match_all( '/^\s*(RewriteBase|RewriteRule)/mi', $teks, $m4 ) ) { $hasil['catatan'][] = 'Ada ' . count( $m4[0] ) . ' baris Rewrite — pastikan blok WordPress standar ada (lihat contoh di panduan).'; } return $hasil; } // --------------------------------------------------------------------------- // Sambungan basis data (dipakai baik untuk membaca maupun menulis) // --------------------------------------------------------------------------- /** Membuka sambungan memakai konstanta wp-config. Mengembalikan array atau null. */ function cw_koneksi( $konf ) { if ( empty( $konf['DB_NAME'] ) ) { return null; } $host = $konf['DB_HOST'] ?? 'localhost'; $user = $konf['DB_USER'] ?? ''; $pass = $konf['DB_PASSWORD'] ?? ''; $nama = $konf['DB_NAME']; if ( class_exists( 'mysqli' ) ) { $db = @new mysqli( $host, $user, $pass, $nama ); if ( ! $db->connect_errno ) { return array( 'jenis' => 'mysqli', 'db' => $db ); } return array( 'jenis' => 'gagal', 'pesan' => 'Tidak bisa tersambung ke basis data: ' . $db->connect_error ); } if ( extension_loaded( 'pdo_mysql' ) ) { try { $pdo = new PDO( "mysql:host=$host;dbname=$nama;charset=utf8mb4", $user, $pass, array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ) ); return array( 'jenis' => 'pdo', 'db' => $pdo ); } catch ( Exception $e ) { return array( 'jenis' => 'gagal', 'pesan' => 'Tidak bisa tersambung ke basis data: ' . $e->getMessage() ); } } return null; // tidak ada pengandar MySQL (mis. instalasi SQLite) } function cw_sql_pilih( $koneksi, $sql ) { $db = $koneksi['db']; if ( 'mysqli' === $koneksi['jenis'] ) { $r = $db->query( $sql ); $baris = array(); if ( $r instanceof mysqli_result ) { while ( $b = $r->fetch_assoc() ) { $baris[] = $b; } } return $baris; } return $db->query( $sql )->fetchAll( PDO::FETCH_ASSOC ); } function cw_sql_ubah( $koneksi, $sql ) { $db = $koneksi['db']; return 'mysqli' === $koneksi['jenis'] ? (bool) $db->query( $sql ) : (bool) $db->exec( $sql ); } /** Dua perintah UPDATE yang dibutuhkan untuk memperbaiki alamat situs. */ function cw_sql_perbaiki_alamat( $prefix, $alamat ) { $aman = str_replace( array( "'", '\\' ), array( "''", '\\\\' ), (string) $alamat ); return array( "UPDATE {$prefix}options SET option_value='{$aman}' WHERE option_name='siteurl'", "UPDATE {$prefix}options SET option_value='{$aman}' WHERE option_name='home'", ); } function cw_baca_opsi( $konf ) { $info = array( 'cara' => '', 'pesan' => '', 'siteurl' => null, 'home' => null, 'blogname' => null, 'admin' => array(), 'jumlahAdmin' => 0 ); $prefix = $konf['table_prefix'] ?? 'wp_'; $koneksi = cw_koneksi( $konf ); if ( null === $koneksi ) { $info['pesan'] = class_exists( 'mysqli' ) || extension_loaded( 'pdo_mysql' ) ? 'Konstanta basis data belum terbaca dari wp-config.php.' : 'PHP di server ini tidak memuat mysqli/pdo_mysql — pemeriksaan basis data dilewati (bukan tanda kerusakan).'; return $info; } if ( 'gagal' === $koneksi['jenis'] ) { $info['pesan'] = $koneksi['pesan']; return $info; } $info['cara'] = $koneksi['jenis']; try { $opsi = cw_sql_pilih( $koneksi, "SELECT option_name, option_value FROM {$prefix}options WHERE option_name IN ('siteurl','home','blogname')" ); foreach ( $opsi as $o ) { if ( 'siteurl' === $o['option_name'] ) { $info['siteurl'] = $o['option_value']; } if ( 'home' === $o['option_name'] ) { $info['home'] = $o['option_value']; } if ( 'blogname' === $o['option_name'] ) { $info['blogname'] = $o['option_value']; } } if ( null === $info['siteurl'] ) { $info['pesan'] = "Tabel {$prefix}options tidak ditemukan/kosong — basis data belum berisi instalasi WordPress."; return $info; } $adm = cw_sql_pilih( $koneksi, "SELECT u.user_login, u.user_email FROM {$prefix}users u INNER JOIN {$prefix}usermeta m ON m.user_id=u.ID WHERE m.meta_key='{$prefix}capabilities' AND m.meta_value LIKE '%administrator%' LIMIT 20" ); $info['admin'] = $adm; $info['jumlahAdmin'] = count( $adm ); } catch ( Exception $e ) { $info['pesan'] = 'Galat saat membaca basis data: ' . $e->getMessage(); } return $info; } function cw_periksa_berkas( $dir ) { $penting = array( 'wp-config.php', 'wp-load.php', 'index.php', 'wp-login.php', 'wp-settings.php', 'xmlrpc.php', 'wp-admin/index.php', 'wp-includes/version.php' ); $hasil = array(); foreach ( $penting as $p ) { $hasil[ $p ] = is_file( $dir . '/' . $p ); } return $hasil; } function cw_gaya() { return ''; } function cw_halaman() { $h = cw_gaya(); $h .= '

Pemeriksa WordPress — ikipie.com

'; $h .= '

Laporan baca-saja. Alamat IP di bawah dipakai untuk mengarahkan DNS domain ke server ini.

'; // ---- 1. Server ------------------------------------------------------- $ssl = ( ! empty( $_SERVER['HTTPS'] ) && 'off' !== $_SERVER['HTTPS'] ) || ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && 'https' === $_SERVER['HTTP_X_FORWARDED_PROTO'] ); $h .= '

1. Server yang sedang melayani halaman ini

'; $h .= ''; $h .= ''; $h .= ''; $h .= ''; $h .= ''; $h .= '
Alamat IP server' . cw_esc( $_SERVER['SERVER_ADDR'] ?? '(tidak terbaca)' ) . ' ← ini yang dipakai di record A domain
Nama host yang dipanggil' . cw_esc( $_SERVER['HTTP_HOST'] ?? '-' ) . '
Folder akar web (DOCUMENT_ROOT)' . cw_esc( $_SERVER['DOCUMENT_ROOT'] ?? '-' ) . '
HTTPS' . ( $ssl ? 'AKTIF' : 'BELUM AKTIF (situs masih http)' ) . '
PHP' . cw_esc( PHP_VERSION ) . ' · pangkalan data tersedia: ' . cw_esc( implode( ', ', array_filter( array( class_exists( 'mysqli' ) ? 'mysqli' : null, extension_loaded( 'pdo_mysql' ) ? 'pdo_mysql' : null, extension_loaded( 'pdo_sqlite' ) ? 'pdo_sqlite' : null ) ) ) ?: 'tidak terdeteksi' ) . '
'; // ---- 2. Di mana WordPress ------------------------------------------- $kandidat = cw_cari_install(); $wp_root = null; $h .= '

2. Berkas WordPress ada di mana?

'; foreach ( $kandidat as $k ) { $tanda = array(); if ( $k['wp_load'] ) { $tanda[] = 'wp-load.php'; if ( null === $wp_root ) { $wp_root = $k['dir']; } } if ( $k['wp_config'] ) { $tanda[] = 'wp-config.php'; } if ( $k['wp_admin'] ) { $tanda[] = 'wp-admin/'; } if ( $k['wp_content'] ) { $tanda[] = 'wp-content/'; } if ( $k['index_php'] ) { $tanda[] = 'index.php'; } if ( $k['htaccess'] ) { $tanda[] = '.htaccess'; } if ( ! $k['wp_load'] && ! $k['wp_admin'] ) { $tanda[] = 'bukan folder WordPress (' . (int) $k['jumlah'] . ' berkas)'; } $h .= ''; } $h .= '
TempatYang ditemukan
' . cw_esc( $k['label'] ) . '' . cw_esc( $k['dir'] ) . '
' . implode( ' · ', $tanda ) . '
'; if ( $wp_root ) { $h .= '

WORDPRESS DITEMUKAN di ' . cw_esc( $wp_root ) . '

'; } else { $h .= '

TIDAK ADA WORDPRESS di sekitar folder berkas ini — berkas inti WP tidak ditemukan.

'; } // ---- 3. Kelengkapan berkas inti ------------------------------------- if ( $wp_root ) { $berkas = cw_periksa_berkas( $wp_root ); $hilang = array(); $h .= '

3. Kelengkapan berkas inti WordPress

'; foreach ( $berkas as $nama => $ada ) { if ( ! $ada ) { $hilang[] = $nama; } $h .= ''; } $h .= '
' . cw_esc( $nama ) . '' . ( $ada ? 'ada' : 'HILANG' ) . '
'; if ( $hilang ) { $h .= '

Instalasi tidak lengkap — berkas berikut tidak ada: ' . cw_esc( implode( ', ', $hilang ) ) . '. Pasang ulang berkas inti WordPress (unduh wordpress.org → unggah, JANGAN hapus wp-content & wp-config.php).

'; } else { $h .= '

Berkas inti lengkap.

'; } } // ---- 4. wp-config ---------------------------------------------------- $konf = array(); if ( $wp_root && is_file( $wp_root . '/wp-config.php' ) ) { $konf = cw_baca_wp_config( $wp_root . '/wp-config.php' ); $h .= '

4. wp-config.php

'; foreach ( array( 'DB_NAME', 'DB_USER', 'DB_HOST', 'table_prefix', 'WP_HOME', 'WP_SITEURL', 'WP_DEBUG' ) as $k ) { $nilai = $konf[ $k ] ?? null; $h .= ''; } $h .= ''; $h .= ''; $h .= '
' . cw_esc( $k ) . '' . ( null === $nilai ? 'tidak diisi' : '' . cw_esc( $nilai ) . '' ) . '
DB_PASSWORD' . ( isset( $konf['DB_PASSWORD'] ) ? 'ada (tidak ditampilkan di halaman ini)' : 'kosong' ) . '
Panjang berkas' . (int) ( $konf['__panjang'] ?? 0 ) . ' karakter
'; if ( isset( $konf['WP_HOME'] ) || isset( $konf['WP_SITEURL'] ) ) { $h .= '

Alamat situs DIKUNCI dari wp-config.php (WP_HOME/WP_SITEURL). Mengubah siteurl di basis data tidak berefek selama baris itu ada.

'; } } else { $h .= '

4. wp-config.php

wp-config.php tidak ditemukan — WordPress belum dikonfigurasi (atau berkasnya terhapus).

'; } // ---- 5. Basis data --------------------------------------------------- $sql = array( 'pesan' => '', 'siteurl' => null, 'home' => null, 'admin' => array() ); if ( $konf ) { $sql = cw_baca_opsi( $konf ); } $h .= '

5. Basis data & alamat situs (siteurl / home)

'; if ( ! empty( $sql['pesan'] ) ) { $h .= '

Basis data tidak terbaca — ' . cw_esc( $sql['pesan'] ) . '

'; } if ( isset( $sql['siteurl'] ) ) { $alamat_sekarang = ( $ssl ? 'https://' : 'http://' ) . ( $_SERVER['HTTP_HOST'] ?? '' ); $cocok = ( rtrim( (string) $sql['siteurl'], '/' ) === rtrim( (string) $alamat_sekarang, '/' ) ) || ( rtrim( (string) $sql['home'], '/' ) === rtrim( (string) $alamat_sekarang, '/' ) ); $h .= ''; $h .= ''; $h .= ''; $h .= ''; $h .= ''; $h .= '
siteurl' . cw_esc( $sql['siteurl'] ) . '
home' . cw_esc( $sql['home'] ) . '
Judul situs' . cw_esc( $sql['blogname'] ) . '
Administrator' . ( $sql['admin'] ? cw_esc( implode( ', ', array_map( function ( $a ) { return $a['user_login'] . ' <' . $a['user_email'] . '>'; }, $sql['admin'] ) ) ) : 'TIDAK ADA akun administrator' ) . '
'; $h .= '

' . ( $cocok ? 'Alamat di basis data cocok dengan alamat yang sedang dibuka.' : 'Alamat TIDAK cocok — halaman dibuka dari ' . cw_esc( $alamat_sekarang ) . ' tetapi WordPress dikonfigurasi untuk ' . cw_esc( $sql['siteurl'] ) . '. Ini penyebab klasik "terlalu banyak pengalihan" atau tampilan tanpa gaya.' ) . '

'; } // ---- 6. .htaccess ---------------------------------------------------- $h .= '

6. Berkas .htaccess (pengalihan & aturan)

'; foreach ( $kandidat as $k ) { if ( ! $k['htaccess'] && ! $k['wp_load'] ) { continue; } $periksa = cw_periksa_htaccess( $k['dir'] . '/.htaccess' ); $h .= '

' . cw_esc( $k['label'] ) . ': '; if ( ! $periksa['ada'] ) { $h .= '.htaccess TIDAK ADA — tanpa berkas ini, tautan halaman ("permalink") akan 404. Salin contoh dari panduan.

'; continue; } $h .= 'ada (' . strlen( $periksa['teks'] ) . ' karakter)'; if ( $periksa['luar'] ) { $h .= '
ADA PENGALIHAN KE ALAMAT LUAR — periksa baris berikut, ini bisa melempar pengunjung ke situs lain (mis. Google):'; $h .= '
' . cw_esc( implode( "\n", array_slice( $periksa['luar'], 0, 10 ) ) ) . '
'; } else { $h .= ' · tidak ada pengalihan ke alamat luar.'; } if ( $periksa['inti'] ) { $h .= ' · memuat aturan WordPress.'; } else { $h .= ' · tidak terlihat blok WordPress (permalinks bisa 404).'; } foreach ( $periksa['catatan'] as $c ) { $h .= '
' . cw_esc( $c ) . ''; } $h .= '

'; $h .= '
' . cw_esc( $periksa['teks'] ) . '
'; } // ---- 7. Tindakan ----------------------------------------------------- $h .= '

7. Perbaiki alamat situs (opsional)

'; if ( hash_equals( CW_TOKEN, (string) ( $_GET['k'] ?? '' ) ) ) { if ( ! $wp_root ) { $h .= '

WordPress belum ditemukan — tidak ada yang bisa diperbaiki dari sini.

'; } elseif ( isset( $konf['WP_HOME'] ) || isset( $konf['WP_SITEURL'] ) ) { $h .= '

Dikunci wp-config.php — ubah baris WP_HOME/WP_SITEURL di wp-config.php dahulu.

'; } else { $h .= '

Menulis siteurl & home ke basis data. Isi alamat yang benar.

' . '' . '

' . '
'; } } else { $h .= '

Tindakan ini butuh kata rahasia: cek-wordpress.php?k=KATA-RAHASIA-ANDA (lihat CW_TOKEN di berkas ini).

'; } $h .= '

8. Jangan lupa

'; $h .= '
'; return $h; } /** * Memperbaiki siteurl & home. * 1) lewat SQL langsung (paling tahan banting — tetap jalan walau berkas inti * WordPress rusak / wp-admin hilang); * 2) cadangan: lewat WordPress sendiri (untuk basis data non-MySQL). */ function cw_perbaiki_alamat( $alamat ) { $wp_root = null; foreach ( cw_cari_install() as $k ) { if ( $k['wp_load'] ) { $wp_root = $k['dir']; break; } } if ( ! $wp_root || ! is_file( $wp_root . '/wp-config.php' ) ) { return 'wp-config.php tidak ditemukan — tidak ada tempat membaca setelan basis data.'; } $konf = cw_baca_wp_config( $wp_root . '/wp-config.php' ); if ( isset( $konf['WP_HOME'] ) || isset( $konf['WP_SITEURL'] ) ) { return 'Ditolak: wp-config.php mengunci alamat situs (WP_HOME/WP_SITEURL). Ubah/hapus baris itu dahulu, karena perubahan basis data tidak akan berefek.'; } $prefix = $konf['table_prefix'] ?? 'wp_'; $koneksi = cw_koneksi( $konf ); if ( $koneksi && 'gagal' !== $koneksi['jenis'] ) { $perintah = cw_sql_perbaiki_alamat( $prefix, $alamat ); foreach ( $perintah as $sql ) { cw_sql_ubah( $koneksi, $sql ); } return 'siteurl & home sudah disetel ke ' . cw_esc( $alamat ) . ' (lewat basis data langsung).'; } // cadangan: pakai WordPress sendiri define( 'WP_USE_THEMES', false ); require_once $wp_root . '/wp-load.php'; if ( function_exists( 'update_option' ) ) { update_option( 'siteurl', $alamat ); update_option( 'home', $alamat ); return 'siteurl & home sudah disetel ke ' . cw_esc( $alamat ) . ' (lewat WordPress).'; } return 'Tidak bisa menyimpan: pengandar basis data tidak tersedia di server ini.'; } function cw_jalankan() { if ( ! headers_sent() ) { header( 'X-Robots-Tag: noindex, nofollow', true ); header( 'Cache-Control: no-store, max-age=0', true ); } // tindakan menulis (hanya bila token benar & diminta sengaja) $pesan = ''; if ( 'POST' === ( $_SERVER['REQUEST_METHOD'] ?? 'GET' ) && hash_equals( CW_TOKEN, (string) ( $_POST['k'] ?? '' ) ) ) { $alamat = rtrim( trim( (string) ( $_POST['alamat'] ?? '' ) ), '/' ); if ( ! preg_match( '#^https?://#i', $alamat ) ) { $pesan = 'Alamat harus dimulai dengan http:// atau https://'; } else { $pesan = cw_perbaiki_alamat( $alamat ); } } echo cw_gaya(); if ( $pesan ) { echo '
' . $pesan . '
'; } echo cw_halaman(); } if ( ! defined( 'CW_JANGAN_JALAN' ) ) { cw_jalankan(); }