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

10

Текущий результат - «PHP Fatal error: вызов неопределенной функции 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; 
}
PAFoster
источник
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 загружает кучу кода в определенном порядке (вы можете увидеть список действий, выполняемых по типичному запросу в Кодексе ).

Пытаясь запустить ваш код напрямую, вы выполняете непосредственно перед 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 ... не вызывайте его напрямую, иначе он будет выполнен до того, как функция станет доступна.

EAMann
источник
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();
Махди Азарм
источник