Come chiamare wp_get_current_user() in un plugin quando i plugin vengono caricati prima di pluggable.php?
Il risultato attuale è "PHP Fatal error: Call to undefined function wp_get_current_user()" che ha senso, ma non aiuta.
Ho bisogno di utilizzare $current_user.
Ecco il codice che sto attualmente utilizzando:
$wp->init();
do_action( 'init' ); // Controlla lo stato del sito
$file='http://xxxxxxxx.com/wp-admin/wp_includes/pluggable.php';
if ( is_multisite() ) {
if ( true !== ( $file = ms_site_check() ) ) {
require( $file );
die();
}
unset($file);
}
// Ottieni le informazioni dell'utente corrente
$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;
}
Per aggiungere alla risposta di @EAMann, devi racchiudere la tua chiamata a wp_get_current_user()
(o qualsiasi chiamata che tenti di accedere a una funzione definita in pluggable.php
) all'interno dell'azione 'plugins_loaded'
.
Quindi, se stai inserendo questo nel tuo file functions.php
, fallo in questo modo:
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;
// Fai il resto delle operazioni che devono avvenire una volta ottenute le informazioni dell'utente
}
Nota che non siamo interessati a ciò che questa funzione restituisce. Siamo interessati a quando questa funzione viene eseguita, cioè dopo che il file pluggable.php
è stato caricato e ha definito la tua funzione wp_get_current_user()
.
Quindi, non aspettarti di poter fare qualcosa con il valore di ritorno di questa funzione. Invece, considera questa funzione come il punto di partenza per tutto ciò che vuoi fare una volta ottenute le informazioni dell'utente corrente.
Farlo in un plugin
Per completezza, ecco come potresti accedere a una funzione pluggable simile all'interno del contesto del tuo plugin:
(inserisci questo in un file .php nella tua cartella 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() ){
// ... fai operazioni per il tuo utente loggato
}
}
}
$wpse_58429_plugin = new WPSE_58429();
Ho utilizzato questa tecnica con successo per un semplice plugin di tipo "Coming Soon" che reindirizza l'utente a una pagina specifica se non è loggato, usando wp_safe_redirect()
.

come useresti un'azione plugins_loaded
per eseguire wp_safe_redirect()
se una pagina admin di un plugin restituisce HTML prima che header('Location: …')
abbia la possibilità di essere eseguito? Ho un problema in cui una pagina definita usando add_menu_page(…)
restituisce l'header di WP (e il contenuto e il footer) quando il plugin viene caricato, molto prima che plugins_loaded
venga eseguito. Vorrei avere accesso alle funzioni dentro pluggable.php
(per accedere ai dati utente e fare redirect) ma questo sembra impossibile. Hai mai usato add_menu_page
con plugins_loaded
?

Non importa, sembrava impossibile ma non lo era—avevo un errore nel mio codice. In effetti l'ordine di caricamento è esattamente come previsto: i plugin sono inclusi
→ pluggable.php è incluso
→ 'plugins_loaded' viene triggerato
→ 'load-{page_hook}' viene triggerato
→ 'page_hook' viene triggerato

Il problema è che stai cercando di caricare il codice direttamente invece di utilizzare un hook di WordPress. WordPress carica una serie di codici in un ordine specifico (puoi vedere la lista delle azioni eseguite in una tipica richiesta nel Codex).
Cercando di eseguire il tuo codice direttamente, lo stai lanciando appena prima che pluggable.php
venga caricato. E non dovresti provare a fare un include()
diretto di questo file. Lascia che sia WordPress a occuparsene.
Invece, definisci una funzione che recupera le informazioni dell'utente:
function wpse_58429() {
// Recupera le informazioni dell'utente corrente
$current_user = wp_get_current_user();
if ( !($current_user instanceof WP_User) )
return;
return $current_user->user_login;
}
Puoi poi utilizzare questa funzione ovunque nel tuo tema senza problemi. Per esempio:
echo wpse_58429();
Se hai bisogno di utilizzare $current_user
in altro codice, assicurati di lanciare quel codice con un'azione di WordPress... non chiamarlo direttamente o verrà eseguito prima che la funzione sia disponibile.

Aggiungi semplicemente questa funzione al tuo file .php del plugin
function is_logged_in(){
if(function_exists( 'is_user_logged_in' )) {
return is_user_logged_in();
}
}
Poi chiamala dove vuoi per ottenere lo stato di login dell'utente. Per esempio:
echo is_logged_in();
