Come chiamare wp_get_current_user() in un plugin quando i plugin vengono caricati prima di pluggable.php?

13 lug 2012, 23:54:48
Visualizzazioni: 32.5K
Voti: 11

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; 
}
3
Commenti

I plugin vengono caricati prima del pluggable, ma ci sono degli hook disponibili molto dopo. Posta il codice con cui stai lavorando e potremmo aiutarti a trovare un hook migliore.

EAMann EAMann
14 lug 2012 02:31:45

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

// Verifica lo stato del sito $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); }

// 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; }`

PAFoster PAFoster
14 lug 2012 23:15:44

So che niente di tutto questo è corretto, la parte 'init' non la capisco ma era un suggerimento di qualcun altro.

Avevo l'impressione che facesse qualcosa come caricare un file - nel mio caso pluggable.php - in realtà tutto ciò di cui ho bisogno è solo $current_user->user_login

PAFoster PAFoster
14 lug 2012 23:20:29
Tutte le risposte alla domanda 4
2

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

5 apr 2013 17:59:59
Commenti

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?

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

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 inclusipluggable.php è incluso'plugins_loaded' viene triggerato'load-{page_hook}' viene triggerato'page_hook' viene triggerato

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

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.

16 lug 2012 18:37:41
1

Sembra che tu stia caricando il tuo codice prima che alcune funzioni siano disponibili. Hai provato:

 global $current_user; 
 //print_r($current_user); //tutte le informazioni relative all'utente
echo $current_user->ID; //ottieni l'ID dell'utente corrente 
14 lug 2012 00:38:51
Commenti

Sì, ma non puoi ottenere $current_user fino a quando wp_get_current_user() non è disponibile e poiché quella funzione è in pluggable.php, non è disponibile fino a dopo il caricamento dei plugin. Da qui l'errore di funzione non definita.

PAFoster PAFoster
14 lug 2012 02:00:03
0

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();
23 lug 2017 02:24:59