Fungsi JavaScript wp_attempt_focus
menyebabkan masalah ini. Fungsi ini akan menyala tidak lama setelah pemuatan halaman, membersihkan formulir dan memfokuskannya, memaksa pengguna untuk memasukkan informasi login mereka secara manual.
Chrome mengisi nama pengguna dan kata sandi secara otomatis, hanya milidetik sebelum fungsi JS menghapus bidang. Chrome tidak menerima perubahan dengan benar, menampilkan bidang berwarna kuning yang diisi meskipun bidang tersebut benar-benar kosong.
Meskipun saya menghargai fungsionalitas autofokus, saya tidak dapat memikirkan alasan yang baik mengapa seseorang ingin formulir tersebut dihapus secara otomatis.
Sumber
Sayangnya, fungsi tersebut telah di-hardcode wp-login.php
pada baris 913-930 (WordPress 4.0). Mengubah wp-login.php
file sama sekali adalah ide yang buruk, karena itu dapat ditimpa dalam pembaruan WordPress yang akan datang. Jadi kita harus melakukan sedikit 'peretasan'.
Memperbaiki mudah
The wp_attempt_focus
fungsi disebut jika bentuk tidak memiliki kesalahan. Kami beruntung - pemeriksaan kesalahan dilakukan melalui PHP. Ini berarti kita bisa dengan mudah mencegah fungsi menembak dengan memalsukan kesalahan formulir pada waktu yang tepat menggunakan tindakan WP. Saya memilih login_form
tindakan karena tindakan selalu menyala setelah penanganan kesalahan, tepat sebelum panggilan JS. Tambahkan kode berikut ke tema functions.php
(atau file plugin) Anda:
add_action("login_form", "kill_wp_attempt_focus");
function kill_wp_attempt_focus() {
global $error;
$error = TRUE;
}
Memperbaiki peretasan
Perbaikan di atas mencegah fungsi dari menembak sama sekali, yang berarti Anda tidak akan mendapatkan autofokus yang tepat juga. Ada cara lain di sekitarnya: buffering output HTML dan memodifikasinya via ob_start
, seperti yang terinspirasi oleh Geeklab . Buffering memungkinkan kita untuk menghapus bagian kode tertentu - dalam hal ini, bagian autoclear d.value = ''
. Jangan lupa untuk membersihkan buffer.
add_action("login_form", "kill_wp_attempt_focus_start");
function kill_wp_attempt_focus_start() {
ob_start("kill_wp_attempt_focus_replace");
}
function kill_wp_attempt_focus_replace($html) {
return preg_replace("/d.value = '';/", "", $html);
}
add_action("login_footer", "kill_wp_attempt_focus_end");
function kill_wp_attempt_focus_end() {
ob_end_flush();
}