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?
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 );
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 );