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


10

Il risultato attuale è "Errore irreversibile PHP: chiamata alla funzione indefinita wp_get_current_user ()" che ha senso, ma non aiuta.

Devo usare $ current_user.

Ecco il codice che sto attualmente usando:

$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; 
}

1
I plug-in vengono caricati prima di essere collegati, ma ci sono hook disponibili anche dopo. Pubblica il codice con cui stai lavorando e potremmo essere in grado di aiutarti a trovare un hook migliore.
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

So che niente è giusto, il bit 'init' non capisco ma era un suggerimento di qualcun altro. Avevo l'impressione che facesse qualcosa come caricare un file - nel mio caso pluggable.php - davvero tutto ciò di cui ho bisogno è solo $ current_user-> user_login
PAFoster

Risposte:


8

Per aggiungere alla risposta di @ EAMann, devi racchiudere la tua wp_get_current_user()chiamata (o qualsiasi chiamata che tenti di accedere a una funzione definita all'interno pluggable.php) all'interno 'plugins_loaded'dell'azione.

Quindi, se lo stai inserendo nel tuo functions.phpfile, 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;

  // Do the remaining stuff that has to happen once you've gotten your user info
}

Si noti che non siamo interessati a ciò che questa funzione restituisce . Siamo interessati a quando viene eseguita questa funzione , ovvero dopo che il pluggable.phpfile ha caricato e definito la tua wp_get_current_user()funzione.

Quindi, non aspettarti di fare nulla con il valore restituito per questa funzione. Invece, considera questa funzione come il punto di partenza per tutto ciò che vuoi fare una volta che hai le informazioni dell'utente corrente.

Fallo in un plugin

Per completezza, ecco come accedere a una funzione collegabile simile nel contesto del proprio plug-in:

(inseriscilo in un file .php nella tua pluginscartella)

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

Ho usato questa tecnica con successo per un tipo di plug-in "Coming Soon" molto semplice che reindirizza l'utente a una pagina specifica se non ha effettuato l'accesso utilizzando wp_safe_redirect().


come useresti plugins_loadedun'azione da eseguire wp_safe_redirect()se la pagina di amministrazione di un plug-in produce HTML prima che header('Location: …')abbia la possibilità di essere eseguita? Sto riscontrando un problema a causa del quale una pagina definita utilizzando add_menu_page(…)genera l'intestazione (e il contenuto e il piè di pagina) del WP quando viene caricato il plug-in, molto prima che plugins_loadedvenga eseguito. Mi piacerebbe avere accesso alle funzioni all'interno pluggable.php(per accedere ai dati degli utenti e fare reindirizzamenti) ma questo sembra impossibile. Hai usato add_menu_pagecon plugins_loaded?
Quinn Comendant,

1
Non importa, sembrava impossibile, ma non lo era - ho avuto un errore nel mio codice. In effetti l'ordine di caricamento è esattamente come previsto: plugins are includedpluggable.php is included'plugins_loaded' is triggered'load-{page_hook}' is triggered'page_hook' is triggered
Quinn Comendant

3

Il problema è che stai provando a caricare il codice direttamente anziché con un hook di WordPress. WordPress carica un sacco di codice in un ordine specifico (puoi vedere l'elenco delle azioni attivate in una richiesta tipica nel Codice ).

Tentando di attivare direttamente il codice, si esegue poco prima che pluggable.phpvenga caricato. E non dovresti provare include()direttamente a questo file. Lascia che WordPress lo faccia per te.

Definisci invece una funzione che ottenga le informazioni dell'utente:

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

È quindi possibile utilizzare questa funzione in qualsiasi punto del tema senza problemi. Per esempio:

echo wpse_58429();

Se devi usarlo $current_userin un altro codice, assicurati di lanciare quel codice con un'azione WordPress ... non chiamarlo direttamente o verrà eseguito prima che la funzione sia disponibile.


0

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

 global $current_user; 
 //print_r($current_user); //all user related information
echo $current_user->ID; //get current user id 

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

0

Aggiungi semplicemente questa funzione al tuo file .php plugin

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

Quindi chiamalo ovunque tu voglia ottenere lo stato di accesso dell'utente. Per esempio:

echo is_logged_in();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.