web-dev-qa-db-fra.com

get_current_user_id () renvoie 0?

J'essaie d'obtenir l'identifiant de l'utilisateur actuellement connecté dans WordPress. J'ai utilisé le code suivant:

function users_list()
{
   global $current_user;
   $current_user =  wp_get_current_user();
   echo 'User ID: ' . $current_user->ID ;
   print_r($current_user);

}

Le code ci-dessus renvoie le résultat vide comme suit:

WP_User Object ( [data] => [ID] => 0 [caps] => Array ( ) [cap_key] => [roles] => Array ( ) [allcaps] => Array ( ) [filter] => )
5
PHP Learner

En passant par wp_get_current_user () dans le Codex, la fonction utilise l’objet global $current_user et, si nécessaire, l’initialise avant de l’utiliser. Comme d'autres l'ont déjà dit, get_current_user_id() utilise cette fonction sur le backend.

Considérez /wp-includes/user.php , lignes 323-327 (la définition de la fonction pour ce code). À la fin, la valeur de retour est return ( isset( $user->ID ) ? (int) $user->ID : 0 ); - ce code renverra 0 si l'utilisateur connecté est indisponible.

Utilisez init ou toute action ultérieure pour appeler cette fonction. L'appeler en dehors d'une action peut entraîner des problèmes. Voir # 14024 pour plus de détails.

Cela vient de la documentation pour wp_get_current_user. Si vous utilisiez ce code dans un modèle, vous pouvez être assuré que init a déjà été appelé. Toutefois, si vous ne récupérez que de manière aléatoire cette action utilisateur avantinit, vous n'obtiendrez pas d'utilisateur actuel. Cela explique pourquoi vous avez obtenu l'ID utilisateur lors de l'ajout de ces actions dans functions.php (car ces actions ont lieu après init), alors qu'avec votre code d'origine, il n'est pas clair lorsque vous appelez cela.

Veuillez vous référer à la page Plugin API pour une idée générale de l'ordre dans lequel ces différentes actions sont invoquées.

5
Justin Bell

Utilisez toujours get_current_user_id(); sous l'action init.

Voici l'exemple:

add_action('init', 'myFunction');

function myFunction(){

 $user_ID= get_current_user_id();   

   echo"User number $user_ID is loggedin";
}
2
Danish Jamil

Comme mentionné par les autres: Si vous appelez la fonction trop tôt, la valeur 0 sera renvoyée.

Ce type de vérification est un bon moyen de vérifier si c'est "trop ​​tôt" ou non:

// Do NOT check for action 'set_current_user', but for 'init'!!
if ( ! did_action( 'init' ) ) {
    _doing_it_wrong( __FUNCTION__, 'get_current_user_id() called before the init hook', null );
}
$user_id = get_current_user_id();

La raison pour laquelle nous n'utilisons pas did_action('set_current_user') est:

Si un autre code/autre plugin appelé get_current_user_id() trop tôt, le hook set_current_user sera exécuté. Cependant, les données de l'utilisateur actuel sont inexact à ce stade, il n'est donc pas judicieux de se baser sur ce crochet d'action. Ce n'est que lorsque init est exécuté que nous pouvons être sûr d'avoir le bon utilisateur!

1
Philipp