Chromeでログイン画面を開くと、ブラウザによってフォームにユーザー名とパスワードが自動的に入力されます。しかし、送信ボタンを押すと、次のメッセージが表示されます。
エラー:パスワードフィールドは空です。
自動入力されたパスワードにスペースを追加して再度削除すると、ログインできます。何が起こっていますか?
JavaScript関数wp_attempt_focus
がこの問題を引き起こしています。この関数はページがロードされた直後に起動し、フォームをクリアしてそれに焦点を合わせ、ユーザーに手動でログイン情報を入力させます。
Chromeはユーザー名とパスワードを自動的に入力します。JS機能がフィールドをクリアするのはわずか数ミリ秒前です。 Chromeは変更を正しく認識しないため、実際には空のフィールドであっても黄色の塗りつぶされたフィールドが表示されます。
私はオートフォーカス機能を高く評価していますが、フォームが自動的にクリアされることを誰かが望んでいるという正当な理由を考えることはできません。
残念ながら、この関数は913〜930行目のwp-login.php
にハードコードされています(WordPress 4.0)。 wp-login.php
ファイルを完全に変更することは、今後のWordPressアップデートで上書きされる可能性があるため、悪い考えです。だから我々は少し 'ハッキング'に頼らなければならないでしょう。
フォームにエラーがない場合はwp_attempt_focus
関数が呼び出されます。私たちは運がいいです - エラーチェックはPHPを介して行われます。つまり、WPアクションを使用して適切なタイミングでフォームエラーを偽造することで、関数が起動されないようにすることができます。このアクションは常にJS呼び出しの直前に after エラー処理を起動するので、login_form
アクションを選択しました。テーマのfunctions.php
(またはプラグインファイル)に次のコードを追加します。
add_action("login_form", "kill_wp_attempt_focus");
function kill_wp_attempt_focus() {
global $error;
$error = TRUE;
}
上記の修正は、関数が完全に起動するのを防ぎます。つまり、適切なオートフォーカスも得られません。それを回避する別の方法があります: Geeklab に触発されたように、HTML出力をバッファしてob_start
を通してそれを修正するバッファリングにより、コードの特定部分、この場合は自動クリア部分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();
}
私もこの問題を抱えていました。 Scott Allenによるプラグイン "WP-SpamShield"をオフにすると、すべてが再び働き始めました。
私のパスワードはただ空かnullだったので、 "1234"のような他のものに変更しようとしました。スペースを追加して削除しても、JSが無効になることはありませんでした。また別のブラウザを試してみましたので、それは本当にChromeだけでですか?
私がしたのは、データベース内のパスワードハッシュを変更したところ、うまくいったということです。 wp_users.user_pass
。
私の場合、パスワード1234
はBCryptedです:$2a$06$x4lljZOw0Cfuj7jy6qsdp./iX34gaDUMXQIQob4VIHLXQ5yI92RjC