J'ai ajouté un champ de connexion supplémentaire à la page de connexion principale de wordpress. C'est une case à cocher qui doit être cochée (pour accepter les termes et conditions), sinon l'utilisateur ne peut pas se connecter.
J'ai pris le code de cette question qui m'a permis d'ajouter une case à cocher personnalisée à la connexion. Cependant, en essayant de modifier le code donné pour valider si la case à cocher a été cochée, je ne peux pas me rendre au travail.
function check_checkbox($user) {
$acceptance = $_POST['terms_acceptance'];
$user = get_user_by('login', $username );
if( !$user || !isset($acceptance) ){
remove_action('authenticate', 'wp_authenticate_username_password', 20);
$user = new WP_Error( 'denied', __("<strong>ERROR</strong>: You're unique identifier was invalid.") );
}
return null;
}
add_filter( 'wp_authenticate_user', 'check_checkbox', 10, 3 );
J'ai essayé les filtres "authentifier" et "wp_authenticate_user" comme indiqué, mais aucun n'a fonctionné pour moi.
Quelqu'un peut-il me dire ce que je fais mal?
Voici le code de travail complet, mettez-le dans functions.php :
add_action('login_form','my_added_login_field');
function my_added_login_field(){
?>
<p>
<label for="my_extra_field">I agree to the terms<br />
<input type="checkbox" value="1" class="input" id="my_extra_field" name="my_extra_field_name"/></label>
</p>
<?php
}
function check_checkbox($user, $password)
{
if( !isset($_POST['my_extra_field_name']) )
{
remove_action('authenticate', 'wp_authenticate_username_password', 20);
$user = new WP_Error( 'denied', __("<strong>ERROR</strong>: Please agree to our terms.") );
}
return $user;
}
add_filter( 'wp_authenticate_user', 'check_checkbox', 10, 3 );
add_filter('wp_authenticate_user', 'myplugin_auth_login',10,2);
function myplugin_auth_login ($user, $password) {
//do any extra validation stuff here
return $user;
}
Vous devez renvoyer l'objet $user
. Votre fonctionalwaysrenvoie null
. Ceci est complètement non testé, mais il semble que vous ayez juste besoin d'utiliser return $user;
sur la dernière ligne au lieu de return null;