La fonction JavaScript wp_attempt_focus
est à l'origine de ce problème. La fonction se déclenche peu de temps après le chargement de la page, efface le formulaire et se concentre sur celui-ci, forçant les utilisateurs à saisir manuellement leurs informations de connexion.
Chrome remplit automatiquement le nom d'utilisateur et le mot de passe, quelques millisecondes seulement avant que la fonction JS efface le champ. Chrome ne reprend pas correctement les modifications, affichant des champs remplis de couleur jaune même si les champs sont en fait vides.
Bien que j'apprécie la fonctionnalité de mise au point automatique, je ne peux pas penser à une bonne raison pour laquelle quelqu'un voudrait que le formulaire soit automatiquement effacé.
La source
Malheureusement, la fonction a été codée en dur wp-login.php
dans les lignes 913-930 (WordPress 4.0). Changer wp-login.php
complètement le fichier est une mauvaise idée, car il pourrait être écrasé dans toute mise à jour WordPress à venir. Nous devrons donc recourir à un peu de «piratage».
La solution facile
La wp_attempt_focus
fonction est appelée si le formulaire ne contient aucune erreur. Nous avons de la chance - la vérification des erreurs se fait via PHP. Cela signifie que nous pouvons simplement empêcher la fonction de se déclencher en simulant une erreur de formulaire au bon moment en utilisant des actions WP. J'ai choisi l' login_form
action car l'action se déclenche toujours après la gestion des erreurs, juste avant l'appel JS. Ajoutez le code suivant à votre thème functions.php
(ou fichier de plugin):
add_action("login_form", "kill_wp_attempt_focus");
function kill_wp_attempt_focus() {
global $error;
$error = TRUE;
}
La solution hackish
Le correctif ci-dessus empêche la fonction de se déclencher complètement, ce qui signifie que vous n'obtiendrez pas non plus la mise au point automatique appropriée. Il existe une autre solution: mettre en tampon la sortie HTML et la modifier via ob_start
, comme inspiré par Geeklab . La mise en mémoire tampon nous permet de supprimer des parties spécifiques du code - dans ce cas, la partie autoclear d.value = ''
. N'oubliez pas de vider le tampon.
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();
}