get_current_user_id() restituisce 0?
Sto cercando di ottenere l'ID dell'utente attualmente loggato in WordPress. Ho utilizzato il seguente codice:
function users_list()
{
global $current_user;
$current_user = wp_get_current_user();
echo 'ID Utente: ' . $current_user->ID ;
print_r($current_user);
}
Il codice sopra restituisce un risultato vuoto come:
WP_User Object ( [data] => [ID] => 0 [caps] => Array ( ) [cap_key] => [roles] => Array ( ) [allcaps] => Array ( ) [filter] => )

Consultando le informazioni su wp_get_current_user() nel Codex, la funzione utilizza l'oggetto globale $current_user
e, se necessario, lo inizializza prima dell'uso. Come hanno affermato altri, get_current_user_id()
utilizza questa funzione in background.
Considera /wp-includes/user.php, righe 323-327 (la definizione della funzione per questo codice). Alla fine, il valore restituito è return ( isset( $user->ID ) ? (int) $user->ID : 0 );
— questo codice restituirà 0
se l'utente loggato non è disponibile per qualche motivo.
Usa l'azione init o qualsiasi azione successiva per chiamare questa funzione. Chiamarla al di fuori di un'azione può causare problemi. Vedi #14024 per i dettagli.
Questo proviene dalla documentazione di wp_get_current_user
. Se stavi usando questo codice all'interno di un template, potevi essere certo che init
fosse già stato chiamato. Tuttavia, se provi a recuperare le informazioni dell'utente prima che l'azione init
venga chiamata, non otterrai un utente corrente. Questo spiega perché hai ottenuto l'ID dell'utente quando hai aggiunto quelle azioni in functions.php (poiché quelle azioni avvengono dopo init
), mentre con il tuo codice originale non è chiaro quando lo invochi.
Fai riferimento alla pagina Plugin API per un'idea generale dell'ordine in cui queste varie azioni vengono invocate.

Sì, ho controllato nel file wp-includes/user.php, contiene il codice che hai menzionato. Potrebbe essere questo il motivo per cui restituisce l'ID utente 0?

Come menzionato dagli altri: se chiami la funzione troppo presto, restituirà il valore 0
.
Un buon modo per verificare se è "troppo presto" o meno è questo tipo di controllo:
// NON verificare l'azione 'set_current_user', ma 'init'!!
if ( ! did_action( 'init' ) ) {
_doing_it_wrong( __FUNCTION__, 'get_current_user_id() chiamato prima dell\'hook init', null );
}
$user_id = get_current_user_id();
Il motivo per cui non usiamo did_action('set_current_user')
è:
Se qualche altro codice/plugin ha chiamato get_current_user_id()
troppo presto, farà scattare l'esecuzione dell'hook set_current_user
. Tuttavia, i dati dell'utente corrente non sono corretti a questo punto, quindi fare affidamento su quell'hook non è una buona idea - solo quando init
viene eseguito possiamo essere sicuri di avere l'utente corretto!

Per versioni di WordPress > 3.4:
Utilizza:
$current_user_id= get_current_user_id();
Per versioni di WordPress < 3.4:
La documentazione dice che se la versione è inferiore a 3.4, utilizzala con init:
add_action('init', 'get_your_current_user_id');
function get_your_current_user_id(){
$your_current_user_id= get_current_user_id();
//fai qualcosa qui con esso
}
Puoi consultare la documentazione: wp_get_current_user
