web-dev-qa-db-fra.com

Obtenir l'ID utilisateur après la connexion

On m'a demandé d'ajouter une sorte de mécanisme de sécurité à un site où un utilisateur ne peut accéder à son profil que s'il dispose d'un cookie après s'être connecté et ne peut avoir qu'un maximum de 3 cookies. J'ai créé une table dans la base de données pour stocker les cookies afin que je puisse en garder le compte.

Je ne sais pas vraiment comment fonctionne WordPress, mais j'ai pu découvrir qu'il me fallait éditer le fichier functions.php du thème et ajouter une action à l'aide de wp_login. J'ai modifié le fichier functions.php, ajouté l'action, demander l'ID utilisateur et renvoyé 0. Je sais que c'est comme cela que wp_get_current_user est censé fonctionner, il renvoie 0 s'il n'y a personne connecté. Cependant, l'utilisateur IS s'est connecté, mais ne renvoie toujours pas l'ID. Voici le code:

add_action( 'wp_login', 'login_cookie' );
function login_cookie() {
    global $wpdb;
    $user = wp_get_current_user();
    //Get current user
    $id = $user->ID;

    if(!isset($_COOKIE['userCookie'])) {
        // Query the database to see how many cookies they have used
        $cookie_count = $wpdb->get_var("SELECT COUNT(*) FROM wp_cookies WHERE user_id=".$id."");
        // If the returned value is bigger or equal to 3 than the user cannot login
        // they will be logged out, and redirected
        if($cookie_count >= 3) {
            wp_logout();   
            wp_redirect("");                
        }
        //Else they can login and they recieve a new cookie, which will get inserted into the database 
        else {
            $value = password_hash($id,PASSWORD_DEFAULT);
            setcookie('userCookie', $value, time()+360000*24*100, "", "",false);
            $wpdb->insert(
                "wp_cookies",
                [ 'user_id'=>$id, 'cookie_value'=>$value ],
                [ '%d', '%s' ]
            );
        }
    }
}

En outre, cela ne devrait affecter que les utilisateurs normaux, pas les administrateurs. Des idées pour ça?

2
user2941726

wp_login hook donne accès à deux paramètres: $user->user_login (chaîne) et $user (WP_User). Pour les transmettre à votre fonction, vous devez ajouter une priorité (la valeur par défaut est 10) et demander 2 arguments à l'appel add_action ():

function login_cookie($user_login, $user) {
    global $wpdb;

    var_dump($user); // get WP_User object

    //Get current user ID
    $id = $user->ID;
    .....
}

add_action( 'wp_login', 'login_cookie', 10, 2 );
5
Jayson

En réalité, le hook wp_login passe l'objet utilisateur dans son paramètre.

function login_cookie( $user_login, $user ) {
    $user_id = $user->ID; // get user id
    // your next code
}
add_action( 'wp_login', 'login_cookie', 10, 2 );
2
Emetrop