Cum pot apela wp_get_current_user() într-un plugin când plugin-urile sunt încărcate înainte de pluggable.php?
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;
}
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()
.

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
?

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și
→ pluggable.php este inclus
→ 'plugins_loaded' este declanșat
→ 'load-{page_hook}' este declanșat
→ 'page_hook' este declanșat

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ă.

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