web-dev-qa-db-fra.com

Comment appeler wp_get_current_user () dans un plugin lorsque les plugins sont chargés avant pluggable.php?

Le résultat actuel est "Erreur PHP irrécupérable: appel de la fonction non définie wp_get_current_user ()", ce qui a du sens, mais n’aide pas.

J'ai besoin d'utiliser $ current_user.

Voici le code que j'utilise actuellement:

$wp->init(); 
do_action( 'init' ); // Check site status 
$file='http://xxxxxxxx.com/wp-admin/wp_includes/pluggable.php'; 
if ( is_multisite() ) { 
    if ( true !== ( $file = ms_site_check() ) ) { 
        require( $file );
        die(); 
    } 
    unset($file); 
}

// Get the current user's info 
$current_user = wp_get_current_user(); 

if ( !($current_user instanceof WP_User) ) 
    return; 

echo $current_user->user_login; 

function paf_uname(){ 
    return $current_user->user_login; 
}
10
PAFoster

Pour ajouter à la réponse de @ EAMann, vous devez encapsuler votre appel wp_get_current_user() (ou tout appel tentant d'accéder à une fonction définie dans pluggable.php) dans l'action 'plugins_loaded'.

Donc, si vous mettez ceci dans votre fichier functions.php, procédez comme suit:

add_action( 'plugins_loaded', 'get_user_info' );

function get_user_info(){
  $current_user = wp_get_current_user(); 

  if ( !($current_user instanceof WP_User) ) 
    return; 

  echo $current_user->user_login;

  // Do the remaining stuff that has to happen once you've gotten your user info
}

Notez que nous ne sommes pas intéressés par ce que cette fonction renvoie . Nous sommes intéressés par quand cette fonction exécute , à savoir, après le fichier pluggable.php a chargé et défini votre fonction wp_get_current_user().

Donc, ne vous attendez pas à faire quelque chose avec la valeur de retour pour cette fonction. Au lieu de cela, considérez cette fonction comme le point de départ pour tout ce que vous voulez faire une fois que vous avez les informations de l'utilisateur actuel.

Le faire dans un plugin

Par souci d'exhaustivité, voici comment accéder à une fonction plug-in similaire à partir du contexte de votre propre plug-in:

(placez-le dans un fichier .php dans votre dossier plugins)

class WPSE_58429 {
    public function __construct(){
        add_action( 'plugins_loaded', array( $this, 'check_if_user_logged_in' ) );
    }

    public function check_if_user_logged_in(){
        if ( is_user_logged_in() ){
           // ... do stuff for your logged-in user
        }
    }
}

$wpse_58429_plugin = new WPSE_58429();

J'ai utilisé cette technique avec succès pour un type très simple de plug-in "À venir bientôt" qui redirige l'utilisateur vers une page spécifique s'il n'est pas connecté à l'aide de wp_safe_redirect().

8
Tom Auger

Le problème est que vous essayez de charger le code directement plutôt qu'avec un hook WordPress. WordPress charge un tas de code dans un ordre spécifique (vous pouvez voir la liste des actions déclenchées dans une requête typique dans le Codex ).

En essayant de déclencher directement votre code, vous exécutez juste avant que pluggable.php soit chargé. Et vous ne devriez pas essayer de include() ce fichier directement. Laissez WordPress le faire pour vous.

Au lieu de cela, définissez une fonction qui récupère les informations utilisateur:

function wpse_58429() {
    // Get the current user's info 
    $current_user = wp_get_current_user(); 

    if ( !($current_user instanceof WP_User) ) 
        return; 

    return $current_user->user_login; 
}

Vous pouvez ensuite utiliser cette fonction n’importe où dans votre thème sans problème. Par exemple:

echo wpse_58429();

Si vous devez utiliser $current_user dans un autre code, assurez-vous de le déclencher avec une action WordPress ... n'appelez pas le directement, il sera exécuté avant que la fonction ne soit disponible.

3
EAMann

Il semble que vous chargiez votre code avant que certaines fonctions ne soient disponibles. As-tu essayé:

 global $current_user; 
 //print_r($current_user); //all user related information
echo $current_user->ID; //get current user id 
0
Innate

Ajoutez simplement cette fonction à votre fichier .php de plugin

function is_logged_in(){
    if(function_exists( 'is_user_logged_in' )) {
        return is_user_logged_in();
    }
}

Appelez-le ensuite où vous souhaitez obtenir le statut de connexion de l'utilisateur. Par exemple:

echo is_logged_in();
0
mahdi azarm