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

13 июл. 2012 г., 23:54:48
Просмотры: 32.5K
Голосов: 11

Текущий результат - "PHP Fatal error: Call to undefined function wp_get_current_user()", что логично, но не помогает.

Мне нужно использовать $current_user.

Вот код, который я сейчас использую:

$wp->init(); 
do_action( 'init' ); // Проверяем статус сайта
$file='http://xxxxxxxx.com/wp-admin/wp_includes/pluggable.php'; 
if ( is_multisite() ) { 
    if ( true !== ( $file = ms_site_check() ) ) { 
        require( $file );
        die(); 
    } 
    unset($file); 
}

// Получаем информацию о текущем пользователе
$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; 
}
3
Комментарии

Плагины загружаются до загрузки pluggable, но есть доступные хуки и после этого. Покажите код, с которым вы работаете, и мы, возможно, сможем помочь вам найти более подходящий хук.

EAMann EAMann
14 июл. 2012 г. 02:31:45

`$wp->init(); do_action( 'init' );

// Проверка статуса сайта $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); }

// Получение информации о текущем пользователе $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 PAFoster
14 июл. 2012 г. 23:15:44

Я понимаю, что всё это неправильно, часть про 'init' я не понимаю, но это было предложение от кого-то другого.

Я думал, что это делает что-то вроде загрузки файла - в моём случае pluggable.php - на самом деле мне просто нужно получить $current_user->user_login

PAFoster PAFoster
14 июл. 2012 г. 23:20:29
Все ответы на вопрос 4
2

В дополнение к ответу @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;

  // Остальные действия, которые должны произойти после получения информации о пользователе
}

Обратите внимание, что нас не интересует, что эта функция возвращает. Нас интересует когда эта функция выполняется, а именно, после загрузки файла pluggable.php, который определяет функцию wp_get_current_user().

Поэтому не ожидайте, что сможете что-то сделать с возвращаемым значением этой функции. Вместо этого, рассматривайте эту функцию как точку старта для всех действий, которые вы хотите выполнить после получения информации о текущем пользователе.

Выполнение в плагине

Для полноты картины, вот как можно получить доступ к аналогичной pluggable функции из контекста вашего собственного плагина:

(поместите это в .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() ){
           // ... выполняем действия для авторизованного пользователя
        }
    }
}

$wpse_58429_plugin = new WPSE_58429();

Я успешно использовал эту технику для простого плагина типа "Coming Soon", который перенаправляет пользователя на определенную страницу, если он не авторизован, используя wp_safe_redirect().

5 апр. 2013 г. 17:59:59
Комментарии

как использовать действие plugins_loaded для выполнения wp_safe_redirect(), если страница администрирования плагина выводит HTML до того, как сработает header('Location: …')? У меня возникает проблема, когда страница, определённая с помощью add_menu_page(…), выводит заголовок WP (и контент, и подвал) при загрузке плагина, задолго до выполнения plugins_loaded. Мне нужно получить доступ к функциям в pluggable.php (для доступа к данным пользователя и выполнения редиректов), но это кажется невозможным. Вы использовали add_menu_page вместе с plugins_loaded?

Quinn Comendant Quinn Comendant
23 мая 2015 г. 03:45:54

Неважно, казалось невозможным, но это не так — у меня была ошибка в коде. На самом деле порядок загрузки именно такой, как и ожидалось: подключаются плагиныподключается pluggable.phpсрабатывает 'plugins_loaded'срабатывает 'load-{page_hook}'срабатывает 'page_hook'

Quinn Comendant Quinn Comendant
23 мая 2015 г. 04:33:49
0

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

Пытаясь выполнить код напрямую, вы запускаете его прямо перед загрузкой pluggable.php. И вам не следует пытаться подключать этот файл через include() самостоятельно. Позвольте WordPress сделать это за вас.

Вместо этого создайте функцию для получения информации о пользователе:

function wpse_58429() {
    // Получаем информацию о текущем пользователе
    $current_user = wp_get_current_user(); 

    if ( !($current_user instanceof WP_User) ) 
        return; 

    return $current_user->user_login; 
}

Эту функцию можно использовать в любом месте вашей темы без проблем. Например:

echo wpse_58429();

Если вам нужно использовать $current_user в другом коде, убедитесь, что этот код запускается через действие WordPress ... не вызывайте его напрямую, иначе он выполнится до того, как функция станет доступной.

16 июл. 2012 г. 18:37:41
1

Похоже, вы загружаете свой код до того, как станут доступны определенные функции. Попробуйте следующее:

 global $current_user; 
 //print_r($current_user); //вся информация о пользователе
echo $current_user->ID; //получить ID текущего пользователя 
14 июл. 2012 г. 00:38:51
Комментарии

Да, но вы не можете получить $current_user до того, как станет доступна функция wp_get_current_user(), а поскольку эта функция находится в pluggable.php, она не доступна до загрузки плагинов. Отсюда и ошибка undefined function.

PAFoster PAFoster
14 июл. 2012 г. 02:00:03
0

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

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

Затем вызывайте её в любом месте, где нужно проверить статус входа пользователя. Например:

echo is_logged_in();
23 июл. 2017 г. 02:24:59