Jak wywołać wp_get_current_user () we wtyczce, gdy wtyczki są ładowane przed pluggable.php?

10

Obecny wynik to „Błąd krytyczny PHP: wywołanie niezdefiniowanej funkcji wp_get_current_user ()”, co ma sens, ale nie pomaga.

Potrzebuję użyć $ current_user.

Oto kod, którego obecnie używam:

$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
źródło
1
Wtyczki są ładowane przed podłączeniem, ale później dostępne są haki . Opublikuj kod, z którym pracujesz, a możemy pomóc Ci znaleźć lepszy haczyk.
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
Wiem, że nic z tego nie jest słuszne, fragment „init” nie rozumiem, ale był sugestią kogoś innego. Miałem wrażenie, że to coś w rodzaju załadowania pliku - w moim przypadku pluggable.php - naprawdę wszystko, czego potrzebuję, to tylko $ current_user-> user_login
PAFoster

Odpowiedzi:

8

Aby dodać do odpowiedzi @ EAMann, musisz zawinąć swoje wp_get_current_user()połączenie (lub każde połączenie, które próbuje uzyskać dostęp do zdefiniowanej funkcji pluggable.php) w ramach 'plugins_loaded'akcji.

Jeśli więc umieszczasz to w swoim functions.phppliku, zrób to w następujący sposób:

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
}

Zauważ, że nie jesteśmy zainteresowani tym, co ta funkcja zwraca . Interesuje nas , gdy ta funkcja będzie wykonywał , a mianowicie, popluggable.php plik został załadowany i zdefiniowane swoją wp_get_current_user()funkcję.

Więc nie oczekuj, że zrobisz cokolwiek z wartością zwracaną dla tej funkcji. Zamiast tego rozważ tę funkcję jako punkt wyjścia do wszystkiego, co chcesz zrobić po uzyskaniu informacji o bieżącym użytkowniku.

Robiąc to we wtyczce

W celu zapewnienia kompletności, oto jak uzyskasz dostęp do podobnej funkcji wtykowej z poziomu własnej wtyczki:

(umieść to w pliku .php w pluginsfolderze)

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

Z powodzeniem zastosowałem tę technikę do bardzo prostej wtyczki typu „Już wkrótce”, która przekierowuje użytkownika na określoną stronę, jeśli nie jest zalogowany wp_safe_redirect().

Tom Auger
źródło
w jaki sposób użyłbyś plugins_loadedakcji do uruchomienia, wp_safe_redirect()jeśli strona administracyjna wtyczki wyśle ​​kod HTML przed header('Location: …')uruchomieniem? Mam problem polegający na tym, że strona zdefiniowana za pomocą add_menu_page(…)wypisuje nagłówek WP (oraz zawartość i stopkę) podczas ładowania wtyczki na długo przed plugins_loadeduruchomieniem. Chciałbym mieć dostęp do funkcji wewnątrz pluggable.php(do uzyskiwania dostępu do danych użytkownika i wykonywania przekierowań), ale wydaje się to niemożliwe. Czy korzystałeś już add_menu_pagez plugins_loaded?
Quinn Comendant
1
Nieważne, wydawało się to niemożliwe, ale tak nie było - miałem błąd w kodzie. W rzeczywistości kolejność ładowania jest dokładnie taka, jak się spodziewano: plugins are includedpluggable.php is included'plugins_loaded' is triggered'load-{page_hook}' is triggered'page_hook' is triggered
Quinn Comendant
3

Problem polega na tym, że próbujesz załadować kod bezpośrednio, a nie za pomocą haka WordPress. WordPress ładuje wiązkę kodu w określonej kolejności (możesz zobaczyć listę akcji wykonanych w typowym żądaniu w Kodeksie ).

Próbując uruchomić kod bezpośrednio, wykonujesz go tuż przed pluggable.phpzaładowaniem. I nie powinieneś próbować include()bezpośrednio do tego pliku. Niech WordPress zrobi to za Ciebie.

Zamiast tego zdefiniuj funkcję, która pobiera informacje o użytkowniku:

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

Możesz następnie użyć tej funkcji w dowolnym miejscu w motywie bez problemu. Na przykład:

echo wpse_58429();

Jeśli potrzebujesz użyć $current_userw innym kodzie, upewnij się, że odpaliłeś ten kod za pomocą akcji WordPress ... nie wywołuj go bezpośrednio, ponieważ zostanie on wykonany, zanim funkcja będzie dostępna.

EAMann
źródło
0

Wygląda na to, że ładujesz kod, zanim niektóre funkcje będą dostępne. Czy próbowałeś:

 global $current_user; 
 //print_r($current_user); //all user related information
echo $current_user->ID; //get current user id 
Wrodzony
źródło
1
Tak, ale nie możesz uzyskać $ current_user, dopóki wp_get_current_user () nie będzie dostępny, a ponieważ ta funkcja jest w pluggable.php, nie będzie dostępna, dopóki nie zostaną załadowane wtyczki. Stąd niezdefiniowany błąd funkcji.
PAFoster
0

Po prostu dodaj tę funkcję do pliku .php wtyczki

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

Następnie zadzwoń w dowolne miejsce, w którym chcesz uzyskać status logowania użytkownika. Na przykład:

echo is_logged_in();
Mahdi Azarm
źródło