Функція JavaScript wp_attempt_focus
викликає цю проблему. Функція спрацьовує незабаром після завантаження сторінки, очищає форму та фокусується на ній, змушуючи користувачів вручну вводити свої дані для входу.
Chrome заповнює ім’я користувача та пароль автоматично, лише за кілька мілісекунд до того, як функція JS очистить поле. Chrome належним чином не сприймає зміни, показуючи заповнені жовтим кольором поля, навіть якщо поля фактично порожні.
Хоча я ціную функціональність автофокусування, я не можу придумати належну причину, щоб хтось хотів, щоб форма автоматично очищалася.
Джерело
На жаль, функція була жорстко закодована wp-login.php
в рядках 913-930 (WordPress 4.0). Змінити wp-login.php
файл - це погана ідея, оскільки його можна буде перезаписати в будь-якому майбутньому оновлення WordPress. Тож доведеться вдатися до «хакерства».
Просте виправлення
wp_attempt_focus
Функція викликається , якщо форма не має помилок. Нам пощастило - перевірка помилок проводиться через PHP. Це означає, що ми можемо просто запобігти запуску функції, підробивши помилку форми у потрібний час за допомогою дій WP. Я вибрав login_form
дію, оскільки дія завжди запускається після обробки помилок, безпосередньо перед викликом JS. Додайте такий код functions.php
(або файл плагіна):
add_action("login_form", "kill_wp_attempt_focus");
function kill_wp_attempt_focus() {
global $error;
$error = TRUE;
}
Виправлення хакі
Виправлене вище застереження запобігає функціонуванню функції взагалі, а значить, і автоматичного фокусування також не вийде. Є й інший спосіб: буферизація HTML виводу та модифікація за допомогою ob_start
натхнення Geeklab . Буферизація дозволяє нам видалити певні частини коду - у цьому випадку автоядерну частину d.value = ''
. Не забудьте промити буфер.
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();
}