Як зателефонувати wp_get_current_user () у плагін, коли плагіни завантажуються перед pluggable.php?


10

Поточний результат - "Фатальна помилка PHP: виклик невизначеної функції wp_get_current_user ()", що має сенс, але не допомагає.

Мені потрібно використовувати $ current_user.

Ось код, який я зараз використовую:

$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
Плагіни завантажуються перед підключенням, але вже після цього є гачки . Опублікуйте код, з яким ви працюєте, і ми можемо допомогти вам знайти кращий гачок.
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

Я знаю, що нічого з цього не вірно, біт "init", який я не розумію, але був пропозицією від когось іншого. Я був під враженням, що він щось схожий на завантаження файлу - в моєму випадку pluggable.php - дійсно все, що мені потрібно, це лише $ current_user-> user_login
PAFoster

Відповіді:


8

Щоб додати відповідь до @ EAMann, вам потрібно завершити свій wp_get_current_user()виклик (або будь-який дзвінок, який намагається отримати доступ до функції, визначеної в межах pluggable.php) в межах 'plugins_loaded'дії.

Отже, якщо ви поміщаєте це всередину свого functions.phpфайлу, зробіть це так:

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
}

Зверніть увагу, що нас не цікавить, що повертає ця функція . Нас цікавить, коли ця функція виконується , а саме після завантаження pluggable.phpфайлу та визначення вашої wp_get_current_user()функції.

Отже, не сподівайтеся, що ви зробите що-небудь із значенням повернення для цієї функції. Натомість розгляньте цю функцію як вихідну точку для всього, що ви хочете зробити, як тільки отримаєте інформацію про поточного користувача.

Робити це в плагіні

Для повноти, ось як би ви отримали доступ до подібної функції підключення з контексту вашого власного плагіна:

(помістіть це всередині .php-файлу всередині вашої 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() ){
           // ... do stuff for your logged-in user
        }
    }
}

$wpse_58429_plugin = new WPSE_58429();

Я успішно використовував цю методику для дуже простого плагіна типу "Прийдешнє скоро", який перенаправляє користувача на певну сторінку, якщо вони не ввійшли в систему wp_safe_redirect().


як би ви використовували plugins_loadedдію для запуску, wp_safe_redirect()якщо сторінка адміністратора плагіна виводить HTML, перш ніж header('Location: …')з'явиться шанс запуску? У мене виникає проблема, коли сторінка, визначена за допомогою add_menu_page(…)виводу заголовка WP (і вмісту, і нижнього колонтитулу), коли плагін завантажується задовго до plugins_loadedзапуску. Я хотів би мати доступ до функцій всередині pluggable.php(для доступу до даних користувачів та переадресації), але це здається неможливим. Чи використовували ви add_menu_pageз plugins_loaded?
Квінн Комендант

1
Неважливо, це здавалося неможливим, але це не так - у мене виник помилка в коді. Насправді порядок завантаження точно такий, як очікувалося: plugins are includedpluggable.php is included'plugins_loaded' is triggered'load-{page_hook}' is triggered→ →'page_hook' is triggered
Куінн Комендант

3

Проблема полягає в тому, що ви намагаєтеся завантажити код безпосередньо, а не гачком WordPress. WordPress завантажує купу коду у визначеному порядку (список дій, запущених у типовому запиті, ви можете побачити в Codex ).

Намагаючись безпосередньо запустити свій код, ви виконуєте безпосередньо перед pluggable.phpзавантаженням. І вам не слід намагатися include()безпосередньо в цьому файлі. Нехай WordPress зробить це за вас.

Замість цього визначте функцію, яка отримує інформацію про користувача:

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

Потім ви можете без будь-якої проблеми використовувати цю функцію в будь-якій частині теми. Наприклад:

echo wpse_58429();

Якщо вам потрібно скористатися $current_userіншим кодом, переконайтеся, що ви запустили цей код за допомогою дії WordPress ... не викликайте його безпосередньо, або він буде виконаний до того, як функція буде доступна.


0

Схоже, ви завантажуєте свій код до появи певних функцій. Ти намагався:

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

1
Так, але ви не можете отримати $ current_user, поки wp_get_current_user () не буде доступний, і оскільки ця функція знаходиться в pluggable.php, вона недоступна до завантаження плагінів. Звідси невизначена помилка функції.
PAFoster

0

Просто додайте цю функцію у ваш плагін .php файл

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

Потім зателефонуйте в будь-яке місце, де ви хочете отримати статус входу користувача. Наприклад:

echo is_logged_in();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.