Wie rufe ich wp_get_current_user () in einem Plugin auf, wenn Plugins vor pluggable.php geladen werden?

10

Das aktuelle Ergebnis ist "Schwerwiegender PHP-Fehler: Aufruf der undefinierten Funktion wp_get_current_user ()", was sinnvoll ist, aber nicht hilft.

Ich muss $ current_user verwenden.

Hier ist der Code, den ich derzeit verwende:

$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; 
}
PAFoster
quelle
1
Plugins werden vor dem Plug-In geladen, aber danach sind noch Hooks verfügbar. Veröffentlichen Sie den Code, mit dem Sie arbeiten, und wir können Ihnen möglicherweise dabei helfen, einen besseren Haken zu finden.
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
Ich weiß, dass nichts davon richtig ist, das 'Init'-Bit, das ich nicht verstehe, aber ein Vorschlag von jemand anderem war. Ich hatte den Eindruck, dass es so etwas wie das Laden einer Datei tat - in meinem Fall pluggable.php - wirklich alles, was ich brauche, ist nur $ current_user-> user_login
PAFoster

Antworten:

8

Um die Antwort von @ EAMann zu ergänzen, müssen Sie Ihren wp_get_current_user()Anruf (oder jeden Anruf, der versucht, auf eine darin definierte Funktion zuzugreifen pluggable.php) innerhalb der 'plugins_loaded'Aktion einschließen .

Wenn Sie dies in Ihre functions.phpDatei einfügen, gehen Sie folgendermaßen vor:

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
}

Beachten Sie, dass wir nicht daran interessiert sind, was diese Funktion zurückgibt . Wir sind daran interessiert, wann diese Funktion ausgeführt wird , nämlich nachdem die pluggable.phpDatei Ihre wp_get_current_user()Funktion geladen und definiert hat .

Erwarten Sie also nichts mit dem Rückgabewert für diese Funktion. Betrachten Sie diese Funktion stattdessen als Ausgangspunkt für alles, was Sie tun möchten, sobald Sie die aktuellen Benutzerinformationen erhalten haben.

Mach es in einem Plugin

Der Vollständigkeit halber würden Sie im Kontext Ihres eigenen Plugins wie folgt auf eine ähnliche steckbare Funktion zugreifen:

(Legen Sie dies in eine .php-Datei in Ihrem pluginsOrdner)

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

Ich habe diese Technik erfolgreich für ein sehr einfaches Plugin vom Typ "Coming Soon" verwendet, das den Benutzer auf eine bestimmte Seite umleitet, wenn er nicht mit angemeldet ist wp_safe_redirect().

Tom Auger
quelle
Wie würden Sie eine plugins_loadedAktion zum Ausführen verwenden, wp_safe_redirect()wenn die Administrationsseite eines Plugins HTML ausgibt, bevor das header('Location: …')ausgeführt werden kann? Ich habe ein Problem, bei dem eine Seite, die mithilfe von definiert wurde, add_menu_page(…)den WP-Header (sowie Inhalt und Fußzeile) ausgibt, wenn das Plugin geladen wird, lange bevor plugins_loadedes ausgeführt wird. Ich möchte Zugriff auf Funktionen im Inneren haben pluggable.php(um auf Benutzerdaten zuzugreifen und Weiterleitungen durchzuführen), aber dies scheint unmöglich. Hast du add_menu_pagemit verwendet plugins_loaded?
Quinn Comendant
1
Egal, es schien unmöglich, aber es war nicht - ich hatte einen Fehler in meinem Code. Tatsächlich ist die plugins are includedpluggable.php is included'plugins_loaded' is triggered'load-{page_hook}' is triggered'page_hook' is triggered
Ladereihenfolge
3

Das Problem ist, dass Sie versuchen, den Code direkt und nicht mit einem WordPress-Hook zu laden. WordPress lädt eine Reihe von Code in einer bestimmten Reihenfolge (die Liste der Aktionen, die in einer typischen Anforderung ausgelöst wurden, finden Sie im Codex ).

Wenn Sie versuchen, Ihren Code direkt auszulösen, führen Sie ihn kurz vor dem pluggable.phpLaden aus. Und Sie sollten nicht versuchen, include()diese Datei direkt. Lassen Sie WordPress das für Sie tun.

Definieren Sie stattdessen eine Funktion, die die Benutzerinformationen abruft:

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

Sie können diese Funktion dann ohne Probleme an einer beliebigen Stelle in Ihrem Thema verwenden. Beispielsweise:

echo wpse_58429();

Wenn Sie $current_useranderen Code verwenden müssen, stellen Sie sicher, dass Sie diesen Code mit einer WordPress-Aktion auslösen. Rufen Sie ihn nicht direkt auf, da er sonst ausgeführt wird, bevor die Funktion verfügbar ist.

EAMann
quelle
0

Es sieht so aus, als würden Sie Ihren Code laden, bevor bestimmte Funktionen verfügbar sind. Hast du es versucht:

 global $current_user; 
 //print_r($current_user); //all user related information
echo $current_user->ID; //get current user id 
Angeboren
quelle
1
Ja, aber Sie können $ current_user erst erhalten, wenn wp_get_current_user () verfügbar ist. Da sich diese Funktion in pluggable.php befindet, ist sie erst verfügbar, nachdem die Plugins geladen wurden. Daher der undefinierte Funktionsfehler.
PAFoster
0

Fügen Sie diese Funktion einfach zu Ihrer Plugin-PHP-Datei hinzu

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

Rufen Sie es dann an einer beliebigen Stelle auf, an der Sie den Benutzeranmeldestatus erhalten möchten. Beispielsweise:

echo is_logged_in();
Mahdi Azarm
quelle