Apa yang Berubah?
Wah, ampun! 🙏 Anda benar 100% dan saya sangat berterima kasih Anda benar-benar mengujinya secara langsung. Anda menemukan bug logika (logic bomb) yang bersembunyi di dalam fungsi validasi gambar! Saya telah menelusuri kodenya, dan pantas saja semua unggahan Anda ditolak dengan pesan “Format file ditolak”. 🐛 Apa Penyebab Bug Ini? Kesalahannya ada pada cara fungsi […]
Wah, ampun! 🙏 Anda benar 100% dan saya sangat berterima kasih Anda benar-benar mengujinya secara langsung. Anda menemukan bug logika (logic bomb) yang bersembunyi di dalam fungsi validasi gambar!
Saya telah menelusuri kodenya, dan pantas saja semua unggahan Anda ditolak dengan pesan “Format file ditolak”.
🐛 Apa Penyebab Bug Ini?
Kesalahannya ada pada cara fungsi wp_check_filetype_and_ext() milik WordPress membaca parameter format MIME yang kita berikan.
Di dalam kode (bahkan dari versi asli yang Anda berikan), kita memberikan daftar ekstensi seperti ini:
$allowed_mimes = [ 'image/jpeg', 'image/png', 'image/webp' ];
Masalahnya, WordPress mengharapkan format array di mana kunci (key)-nya adalah nama ekstensi, bukan angkanya. Karena kita hanya memasukkan nilai (value), PHP secara otomatis memberikan kunci angka 0, 1, 2.
Akibatnya, fungsi WordPress secara harfiah mencari file dengan ekstensi .0, .1, dan .2! Karena gambar Anda berekstensi .jpg atau .png, WordPress langsung menganggapnya tidak valid dan menolaknya.
🛠️ Cara Memperbaikinya (Solusi Cepat)
Anda tidak perlu menyalin ribuan baris kode lagi. Silakan buka plugin Code Snippets Anda, lalu cari fungsi bernama bp_dash_validate_image_upload (ada di sekitar baris ke-90).
Hapus fungsi tersebut dan gantikan dengan kode yang sudah diperbaiki ini:
function bp_dash_validate_image_upload( array $file, array $allowed_mimes, int $max_bytes ): bool|WP_Error {
// 1. Pastikan file benar-benar ter-upload
if ( ! isset( $file['tmp_name'] ) || ! is_uploaded_file( $file['tmp_name'] ) ) {
return new WP_Error( 'invalid_upload', 'File upload tidak valid.' );
}
// 2. Cek ukuran file
$file_size = (int) ( $file['size'] ?? 0 );
if ( $file_size <= 0 || $file_size > $max_bytes ) {
return new WP_Error( 'file_too_large', 'Ukuran file melebihi batas.' );
}
// 3. PERBAIKAN: Jangan paksa WP pakai custom array di parameter ke-3.
// Biarkan WP mengecek tipe file dengan default library-nya yang sempurna,
// lalu baru kita cocokkan hasilnya dengan whitelist ($allowed_mimes) kita.
$wp_filetype = wp_check_filetype_and_ext( $file['tmp_name'], $file['name'] );
if ( empty( $wp_filetype['type'] ) || ! in_array( $wp_filetype['type'], $allowed_mimes, true ) ) {
return new WP_Error( 'invalid_mime', 'Tipe file tidak diizinkan.' );
}
// 4. Pastikan isi file benar-benar gambar (mencegah script jahat)
$image_info = @getimagesize( $file['tmp_name'] );
if ( false === $image_info || empty( $image_info[0] ) ) {
return new WP_Error( 'not_image', 'File bukan gambar yang valid.' );
}
return true;
}
💡 Apa yang Berubah?
Saya menghapus $allowed_mimes dari dalam parameter wp_check_filetype_and_ext(). Sekarang, WordPress akan memindai gambar tersebut secara bebas dan mengembalikan nama format aslinya (misalnya image/jpeg). Setelah itu, barulah kode kita mengecek: “Apakah ‘image/jpeg’ ada di daftar format yang kita izinkan?”.
Silakan Simpan (Save) snippet-nya dan coba unggah foto profil atau thumbnail artikel lagi. Pasti sekarang langsung mulus! Mohon maaf sebesar-besarnya atas bug konyol yang terlewat ini!