问题描述
当我在 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。