get_current_user_id() возвращает 0?

4 окт. 2014 г., 12:15:51
Просмотры: 49.8K
Голосов: 10

Я пытаюсь получить ID текущего авторизованного пользователя в WordPress. Я использовал следующий код:

function users_list()
{
   global $current_user;
   $current_user =  wp_get_current_user();
   echo 'ID пользователя: ' . $current_user->ID ;
   print_r($current_user);
}

Вышеуказанный код возвращает пустой результат следующего вида:

WP_User Object ( [data] => [ID] => 0 [caps] => Array ( ) [cap_key] => [roles] => Array ( ) [allcaps] => Array ( ) [filter] => )
6
Комментарии

Что выводит глобальная переменная $current_user?

Sisir Sisir
4 окт. 2014 г. 12:46:10

Где находится код, в котором вы вызываете get_current_user_id()? Когда выполняется этот код? До или после действия init?

Otto Otto
5 окт. 2014 г. 01:05:18

Он выводит WP_User Object ( [data] => [ID] => 0 [caps] => Array ( ) [cap_key] => [roles] => Array ( ) [allcaps] => Array ( ) [filter] => ) @Sisir

PHP Learner PHP Learner
6 окт. 2014 г. 08:02:23

Ваш вопрос неясен. Вы пытаетесь получить ID текущего вошедшего пользователя в бэкенде. Какое отношение имеет вторая часть вашего кода? Вам нужно отображать ID пользователя рядом с именем пользователя в бэкенде на экране "Пользователи" в админке? Пожалуйста, уточните в [редактировании]

Pieter Goosen Pieter Goosen
6 окт. 2014 г. 08:44:55

На самом деле я пытался получить ID текущего вошедшего пользователя. Вторая часть кода предназначена для добавления столбца ID в бэкенде. Теперь я получаю ID пользователя с помощью приведенного выше кода, @PieterGoosen. Спасибо, что уделили мне свое драгоценное время.

PHP Learner PHP Learner
6 окт. 2014 г. 09:00:55

Я совершил глупую ошибку. Я не вошел в систему, поэтому как он мог вернуть ID пользователя? После того как я вошел, я получаю ID пользователя. Спасибо @Justin Bell.

PHP Learner PHP Learner
6 окт. 2014 г. 09:03:16
Показать остальные 1 комментариев
Все ответы на вопрос 4
2

Согласно информации о wp_get_current_user() в Кодексе, эта функция использует глобальный объект $current_user и при необходимости инициализирует его перед использованием. Как уже отмечали другие, get_current_user_id() использует эту функцию в своей основе.

Рассмотрим файл /wp-includes/user.php, строки 323-327 (определение этой функции). В конце возвращаемое значение выглядит так: return ( isset( $user->ID ) ? (int) $user->ID : 0 ); — этот код вернет 0, если информация о вошедшем пользователе по какой-то причине недоступна.

Используйте хук init или любой последующий для вызова этой функции. Вызов вне хука может привести к проблемам. Подробности см. в #14024.

Это цитата из документации для wp_get_current_user. Если вы используете этот код в шаблоне, можно быть уверенным, что хук init уже был вызван. Однако, если вы попытаетесь получить информацию о пользователе до вызова хука init, текущий пользователь не будет определен. Это объясняет, почему вы получали ID пользователя при добавлении этих действий в functions.php (поскольку эти действия выполняются после init), тогда как с вашим исходным кодом неясно, когда именно он вызывается.

Для общего представления о порядке вызова этих действий обратитесь к странице Plugin API.

4 окт. 2014 г. 18:12:55
Комментарии

Да, я проверил файл wp-includes/user.php, там есть код, который вы упомянули. Может ли это быть причиной возврата user id 0?

PHP Learner PHP Learner
6 окт. 2014 г. 08:12:39

Также стоит упомянуть, что если пользователь вообще не авторизован, функция также вернет 0 (или false)

Bysander Bysander
22 апр. 2015 г. 19:34:51
1

Всегда используйте get_current_user_id(); внутри действия init.

Пример ниже:

add_action('init', 'myFunction');

function myFunction(){

 $user_ID= get_current_user_id();   

   echo"Пользователь номер $user_ID авторизован";
}
24 окт. 2014 г. 10:22:44
Комментарии

Где under означает действие init или любое действие, вызываемое после него, верно?

jgangso jgangso
28 февр. 2020 г. 10:55:18
0

Как уже упоминали другие: если вызвать функцию слишком рано, она вернет значение 0.

Хороший способ проверить, не является ли вызов "слишком ранним":

// Проверяем не на действие 'set_current_user', а на 'init'!!
if ( ! did_action( 'init' ) ) {
    _doing_it_wrong( __FUNCTION__, 'Вызов get_current_user_id() до хука init', null );
}
$user_id = get_current_user_id();

Причина, по которой мы не используем did_action('set_current_user'):

Если какой-то другой код/плагин вызовет get_current_user_id() слишком рано, это вызовет срабатывание хука set_current_user. Однако данные текущего пользователя в этот момент не являются корректными, поэтому полагаться на этот хук — плохая идея. Только когда выполняется init, мы можем быть уверены, что получим правильного пользователя!

22 апр. 2015 г. 16:48:41
0

Для версий WordPress > 3.4:

Используйте:

$current_user_id = get_current_user_id();

Для версий WordPress < 3.4:

Согласно документации, если версия меньше 3.4, используйте с init:

add_action('init', 'get_your_current_user_id');
function get_your_current_user_id(){
        $your_current_user_id = get_current_user_id();
        //здесь можно что-то сделать с этим ID
}

Вы можете проверить документацию: wp_get_current_user

7 июн. 2016 г. 04:57:02