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

10

Le résultat actuel est "PHP Fatal error: Call to undefined function wp_get_current_user ()" 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; 
}
PAFoster
la source
1
Les plugins sont chargés avant de pouvoir être branchés, mais il y a des hooks disponibles bien après. Postez le code avec lequel vous travaillez et nous pourrons peut-être vous aider à trouver un meilleur crochet.
EAMann
$wp->init(); do_action( 'init' ); // Check site status $file='http://taddy.co.uk/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; }
PAFoster
Je sais que rien de tout cela n'est vrai, le bit «init» que je ne comprends pas mais était une suggestion de quelqu'un d'autre. J'avais l'impression qu'il faisait quelque chose comme charger un fichier - dans mon cas pluggable.php - vraiment tout ce dont j'ai besoin est juste $ current_user-> user_login
PAFoster

Réponses:

8

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

Donc, si vous mettez cela dans votre functions.phpfichier, faites-le comme ceci:

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 le moment où cette fonction s'exécute , à savoir, après que le pluggable.phpfichier a chargé et défini votre wp_get_current_user()fonction.

Donc, ne vous attendez pas à faire quoi que ce soit avec la valeur de retour pour cette fonction. Au lieu de cela, considérez cette fonction comme le point de départ de 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 vous accéderiez à une fonction enfichable similaire à partir du contexte de votre propre plugin:

(mettez-le dans un fichier .php dans votre pluginsdossier)

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 plugin de type "Coming Soon" très simple qui redirige l'utilisateur vers une page spécifique s'il n'est pas connecté en utilisant wp_safe_redirect().

Tom Auger
la source
Comment utiliseriez-vous une plugins_loadedaction à exécuter wp_safe_redirect()si la page d'administration d'un plugin génère du HTML avant que le programme header('Location: …')ait une chance de s'exécuter? J'ai un problème où une page définie en utilisant add_menu_page(…)génère l'en-tête WP (et le contenu et le pied de page) lorsque le plugin se charge, bien avant plugins_loadedson exécution. Je voudrais avoir accès aux fonctions à l'intérieur pluggable.php(pour accéder aux données utilisateur et faire des redirections) mais cela semble impossible. Avez-vous utilisé add_menu_pageavec plugins_loaded?
Quinn Comendant
1
Peu importe, cela semblait impossible, mais ce n'était pas le cas - j'ai eu une erreur dans mon code. En fait, l'ordre de chargement est exactement comme prévu: plugins are includedpluggable.php is included'plugins_loaded' is triggered'load-{page_hook}' is triggered'page_hook' is triggered
Quinn Comendant
3

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 demande typique dans le Codex ).

En essayant de tirer votre code directement, vous exécutez juste avant le pluggable.phpchargement. Et vous ne devez pas essayer include()directement ce fichier. Laissez WordPress faire cela pour vous.

Au lieu de cela, définissez une fonction qui obtient 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_userdans un autre code, assurez-vous de déclencher ce code avec une action WordPress ... ne l'appelez pas directement ou il sera exécuté avant que la fonction ne soit disponible.

EAMann
la source
0

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 
Inné
la source
1
Oui, mais vous ne pouvez pas obtenir $ current_user tant que wp_get_current_user () n'est pas disponible et puisque cette fonction est dans pluggable.php, elle n'est disponible qu'après le chargement des plugins. D'où l'erreur de fonction non définie.
PAFoster
0

Ajoutez simplement cette fonction à votre fichier plugin .php

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

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

echo is_logged_in();
mahdi azarm
la source