get_current_user_id() returnează 0?
Încerc să obțin ID-ul utilizatorului curent logat în WordPress. Am folosit următorul cod:
function users_list()
{
global $current_user;
$current_user = wp_get_current_user();
echo 'ID Utilizator: ' . $current_user->ID ;
print_r($current_user);
}
Codul de mai sus returnează un rezultat gol, astfel:
WP_User Object ( [data] => [ID] => 0 [caps] => Array ( ) [cap_key] => [roles] => Array ( ) [allcaps] => Array ( ) [filter] => )

Conform informațiilor din Codex despre wp_get_current_user(), această funcție utilizează obiectul global $current_user
și, dacă este necesar, îl inițializează înainte de utilizare. După cum au menționat și alții, get_current_user_id()
folosește această funcție în spate.
Luați în considerare /wp-includes/user.php, liniile 323-327 (definiția funcției pentru acest cod). La final, valoarea returnată este return ( isset( $user->ID ) ? (int) $user->ID : 0 );
— acest cod va returna 0
dacă utilizatorul autentificat nu este disponibil din anumite motive.
Folosește acțiunea init sau orice altă acțiune ulterioară pentru a apela această funcție. Apelarea ei în afara unei acțiuni poate cauza probleme. Consultă #14024 pentru detalii.
Această informație provine din documentația pentru wp_get_current_user
. Dacă folosești acest cod într-un template, poți fi sigur că acțiunea init
a fost deja apelată. Totuși, dacă încerci să accesezi informațiile despre utilizator înainte ca acțiunea init
să fie apelată, nu vei obține un utilizator curent. Asta explică de ai obținut ID-ul utilizatorului atunci când ai adăugat acele acțiuni în functions.php (deoarece acele acțiuni au loc după init
), în timp ce cu codul tău original nu este clar când anume se apelează.
Te rugăm să consulți pagina Plugin API pentru a înțelege ordinea în care sunt apelate aceste diverse acțiuni.

Da, am verificat în fișierul wp-includes/user.php, acesta conține codul menționat de dumneavoastră. Poate fi acesta motivul pentru care se returnează ID-ul de utilizator 0?

După cum au menționat și alții: Dacă apelezi funcția prea devreme, va returna valoarea 0
.
O metodă bună de a verifica dacă este "prea devreme" sau nu este următoarea verificare:
// NU verifica pentru acțiunea 'set_current_user', ci pentru 'init'!!
if ( ! did_action( 'init' ) ) {
_doing_it_wrong( __FUNCTION__, 'get_current_user_id() apelat înainte de hook-ul init', null );
}
$user_id = get_current_user_id();
Motivul pentru care nu folosim did_action('set_current_user')
este:
Dacă alt cod sau alt plugin apelează get_current_user_id()
prea devreme, va declanșa rularea hook-ului set_current_user
. Totuși, datele despre utilizatorul curent nu sunt corecte în acest moment, așa că a te baza pe acest hook nu este o idee bună - doar când este executat init
putem fi siguri că avem utilizatorul corect!

Pentru versiuni WordPress > 3.4:
Folosește:
$current_user_id = get_current_user_id();
Pentru versiuni WordPress < 3.4:
Documentația spune că dacă versiunea este mai mică decât 3.4, folosește-o cu init:
add_action('init', 'get_your_current_user_id');
function get_your_current_user_id(){
$your_current_user_id = get_current_user_id();
//fă ceva cu el aici
}
Poți verifica documentația: wp_get_current_user
