問題描述
當我在 Chrome 上開啟登入螢幕時,瀏覽器會自動使用我的使用者名稱和密碼填寫表單。但是,當我點選提交按鈕時,我會收到以下訊息:
ERROR: The password field is empty.
為自動填寫的密碼新增空間並再次刪除它可以讓我登入。發生了什麼?
最佳解決方案
JavaScript 函式 wp_attempt_focus 導致此問題。該功能在頁面載入後立即啟動,清除表單並對其進行聚焦,強制使用者手動輸入其登入資訊。
Chrome 正在自動填寫使用者名稱和密碼,在 JS 功能清除該欄位之前幾毫秒。 Chrome 無法正確接收更改,即使欄位實際為空,也會顯示黃色填充欄位。
雖然我欣賞自動對焦功能,我不能想到任何人都希望表單自動清除的好理由。
來源
可悲的是,該功能已經在 913-930 行 (WordPress 4.0) 中的 wp-login.php 中進行了硬編碼。更改 wp-login.php 檔案是一個壞主意,因為它可能會被覆蓋在任何即將到來的 WordPress 更新。所以我們不得不求助於一些’hacking’ 。
容易修復
如果表單沒有錯誤,則呼叫 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();
}
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。