get_current_user_id() возвращает 0?
Я пытаюсь получить 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] => )

Согласно информации о 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.

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

Для версий 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
