¿get_current_user_id() devuelve 0?
Estoy tratando de obtener el ID del usuario actualmente conectado en WordPress. He usado el siguiente código:
function users_list()
{
global $current_user;
$current_user = wp_get_current_user();
echo 'ID de Usuario: ' . $current_user->ID ;
print_r($current_user);
}
El código anterior devuelve un resultado vacío como este:
WP_User Object ( [data] => [ID] => 0 [caps] => Array ( ) [cap_key] => [roles] => Array ( ) [allcaps] => Array ( ) [filter] => )

Según la información de wp_get_current_user() en el Codex, la función utiliza el objeto global $current_user
y, si es necesario, lo inicializa antes de usarlo. Como otros han mencionado, get_current_user_id()
utiliza esta función en segundo plano.
Considera /wp-includes/user.php, líneas 323-327 (la definición de la función para este código). Al final, el valor de retorno es return ( isset( $user->ID ) ? (int) $user->ID : 0 );
— este código devolverá 0
si el usuario conectado no está disponible por alguna razón.
Usa el hook init o cualquier acción posterior para llamar a esta función. Llamarla fuera de una acción puede causar problemas. Consulta #14024 para más detalles.
Esto proviene de la documentación de wp_get_current_user
. Si estás utilizando este código dentro de una plantilla, puedes estar seguro de que init
ya ha sido ejecutado. Sin embargo, si intentas obtener información del usuario antes de que se llame a la acción init
, no obtendrás el usuario actual. Esto explica por qué obtuviste el ID del usuario al añadir esas acciones en functions.php (ya que esas acciones ocurren después de init
), mientras que con tu código original no está claro cuándo lo invocas.
Por favor, consulta la página de la API de Plugins para tener una idea general del orden en que se invocan estas diversas acciones.

Sí, he verificado en el archivo wp-includes/user.php, tiene el código que mencionaste. ¿Podría ser esta la razón por la que devuelve el ID de usuario 0?

Como mencionaron otros: Si llamas a la función demasiado temprano, devolverá el valor 0
Una buena forma de verificar si es "demasiado temprano" o no es este tipo de comprobación:
// NO verifiques la acción 'set_current_user', sino 'init'!!
if ( ! did_action( 'init' ) ) {
_doing_it_wrong( __FUNCTION__, 'get_current_user_id() llamado antes del hook init', null );
}
$user_id = get_current_user_id();
La razón por la que no usamos did_action('set_current_user')
es:
Si algún otro código/plugin llamó a get_current_user_id()
demasiado temprano, activará que se ejecute el hook set_current_user
. Sin embargo, los datos del usuario actual no son correctos en este punto, por lo que confiar en ese hook de acción no es una buena idea. ¡Solo cuando se ejecuta init
podemos estar seguros de tener el usuario correcto!

Para versiones de WordPress > 3.4:
Usa:
$current_user_id= get_current_user_id();
Para versiones de WordPress < 3.4:
La documentación dice que si la versión es menor a 3.4 se debe usar con init:
add_action('init', 'get_your_current_user_id');
function get_your_current_user_id(){
$your_current_user_id= get_current_user_id();
//haz algo aquí con ello
}
Puedes consultar la documentación: wp_get_current_user
