Как вызвать wp_get_current_user() в плагине, когда плагины загружаются раньше pluggable.php?
Текущий результат - "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;
}

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

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

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

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

Просто добавьте эту функцию в файл .php вашего плагина
function is_logged_in(){
if(function_exists( 'is_user_logged_in' )) {
return is_user_logged_in();
}
}
Затем вызывайте её в любом месте, где нужно проверить статус входа пользователя. Например:
echo is_logged_in();
