Cum pot apela wp_get_current_user() într-un plugin când plugin-urile sunt încărcate înainte de pluggable.php?

13 iul. 2012, 23:54:48
Vizualizări: 32.5K
Voturi: 11

Rezultatul actual este "PHP Fatal error: Call to undefined function wp_get_current_user()" ceea ce are sens, dar nu ajută.

Am nevoie să folosesc $current_user.

Iată codul pe care îl folosesc în prezent:

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

// Obține informațiile utilizatorului curent 
$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; 
}
3
Comentarii

Plugin-urile sunt încărcate înainte de pluggable, dar există hooks disponibile mult după aceea. Postează codul la care lucrezi și poate vom putea să te ajutăm să găsești un hook mai potrivit.

EAMann EAMann
14 iul. 2012 02:31:45

`$wp->init(); do_action( 'init' );

// Verifică statusul site-ului $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); }

// Obține informațiile utilizatorului curent $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 PAFoster
14 iul. 2012 23:15:44

Știu că niciuna dintre acestea nu este corectă, partea cu 'init' nu o înțeleg dar a fost o sugestie de la altcineva.

Am avut impresia că face ceva de genul încărcării unui fișier - în cazul meu pluggable.php - tot ce am nevoie de fapt este doar $current_user->user_login

PAFoster PAFoster
14 iul. 2012 23:20:29
Toate răspunsurile la întrebare 4
2

Pentru a completa răspunsul lui @EAMann, trebuie să încapsulezi apelul tău wp_get_current_user() (sau orice apel care încearcă să acceseze o funcție definită în pluggable.php) în cadrul acțiunii 'plugins_loaded'.

Deci, dacă pui asta în fișierul tău functions.php, fă-o astfel:

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;

  // Faci restul operațiilor care trebuie efectuate odată ce ai obținut informațiile utilizatorului
}

Reține că nu ne interesează ce returnează această funcție. Ne interesează când se execută această funcție, și anume, după ce fișierul pluggable.php s-a încărcat și a definit funcția ta wp_get_current_user().

Deci, nu te aștepta să faci ceva cu valoarea returnată de această funcție. În schimb, consideră această funcție ca punctul de plecare pentru tot ce vrei să faci odată ce ai obținut informațiile utilizatorului curent.

Implementarea într-un plugin

Pentru a fi complet, iată cum ai putea accesa o funcție pluggable similară din cadrul propriului tău plugin:

(pune asta într-un fișier .php în folderul tău 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() ){
           // ... faci operații pentru utilizatorul autentificat
        }
    }
}

$wpse_58429_plugin = new WPSE_58429();

Am folosit această tehnică cu succes pentru un plugin simplu de tip "În curând" care redirecționează utilizatorul către o pagină specifică dacă nu este autentificat, folosind wp_safe_redirect().

5 apr. 2013 17:59:59
Comentarii

cum ai folosi o acțiune plugins_loaded pentru a rula wp_safe_redirect() dacă pagina de administrare a unui plugin afișează HTML înainte ca header('Location: …') să aibă șansa să ruleze? Am o problemă unde o pagină definită folosind add_menu_page(…) afișează antetul WP (și conținutul și subsolul) când pluginul se încarcă, mult înainte ca plugins_loaded să ruleze. Aș dori să am acces la funcțiile din pluggable.php (pentru accesarea datelor utilizatorului și redirecționări), dar acest lucru pare imposibil. Ai folosit add_menu_page cu plugins_loaded?

Quinn Comendant Quinn Comendant
23 mai 2015 03:45:54

Nu mai contează, părea imposibil, dar nu a fost—aveam o eroare în codul meu. De fapt, ordinea de încărcare este exact cum era de așteptat: pluginii sunt inclușipluggable.php este inclus'plugins_loaded' este declanșat'load-{page_hook}' este declanșat'page_hook' este declanșat

Quinn Comendant Quinn Comendant
23 mai 2015 04:33:49
0

Problema este că încerci să încarci codul direct, fără să folosești un hook WordPress. WordPress încarcă o serie de coduri într-o anumită ordine (poți vedea lista de acțiuni declanșate într-o solicitare tipică în Codex).

Prin încercarea de a executa codul direct, acesta se execută chiar înainte ca pluggable.php să fie încărcat. Și nu ar trebui să încerci să folosești include() pentru acest fișier direct. Lasă WordPress să facă asta pentru tine.

În schimb, definește o funcție care obține informațiile utilizatorului:

function wpse_58429() {
    // Obține informațiile utilizatorului curent
    $current_user = wp_get_current_user(); 

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

    return $current_user->user_login; 
}

Poți folosi această funcție oriunde în tema ta fără probleme. De exemplu:

echo wpse_58429();

Dacă ai nevoie să folosești $current_user în alt cod, asigură-te că execți acel cod cu o acțiune WordPress ... nu-l apela direct, altfel va fi executat înainte ca funcția să fie disponibilă.

16 iul. 2012 18:37:41
1

Se pare că încarci codul înainte ca anumite funcții să fie disponibile. Ai încercat:

 global $current_user; 
 //print_r($current_user); //toate informațiile legate de utilizator
echo $current_user->ID; //obține ID-ul utilizatorului curent 
14 iul. 2012 00:38:51
Comentarii

Da, dar nu poți obține $current_user până când funcția wp_get_current_user() este disponibilă, iar întrucât această funcție se află în pluggable.php, ea nu este accesibilă decât după încărcarea plugin-urilor. De aici și eroarea de funcție nedefinită.

PAFoster PAFoster
14 iul. 2012 02:00:03
0

Pur și simplu adaugă această funcție în fișierul .php al plugin-ului tău

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

Apoi apelează-o oriunde dorești să obții starea de autentificare a utilizatorului. De exemplu:

echo is_logged_in();
23 iul. 2017 02:24:59