Când să folosim global $post și alte variabile globale?
Încerc să înțeleg când și de ce ar trebui să folosesc variabila globală $post. Am încercat să fac următorul lucru pe o pagină de articol, în afara buclei, și după cum era de așteptat, funcționează.
<?php
global $post;
echo $post->ID;
?>
Dacă fac același lucru pe o pagină de arhivă (doar am vrut să văd ce se întâmplă), din anumite motive funcționează și acolo, recuperând ID-ul articolului anterior, chiar dacă am șters codul de mai sus din pagina anterioară a articolului. Este aceasta un fel de memorare în cache? Cum funcționează exact?
Înțeleg că global $post poate fi util dacă lucrez la o funcție în functions.php. Este acesta singurul caz de utilizare?
Mulțumesc mult
Aceasta este poate o întrebare prea largă pentru a răspunde corect. Variabila globală $post
ar putea fi utilizată în diverse moduri. Dacă ar trebui sau nu să fie folosită depinde de fiecare situație în parte.
Totuși, după cum înțeleg eu, scopul principal al variabilei globale $post
este utilizarea ei în fișierele de șabloane ale temei.
Când folosești the_title()
sau the_content()
sau the_author()
sau oricare dintre numeroasele funcții de șablon, WordPress caută aceste informații în variabila globală $post
. Ca regulă generală, atunci când lucrezi în fișierele de șabloane, vei dori întotdeauna să folosești aceste funcții de șablon, cum ar fi get_the_ID()
, în loc să accesezi direct $post->ID
.
Deci, dacă vrei să înțelegi mai bine variabila globală $post
, ar trebui să citești despre cum funcționează The Loop în WordPress, în special în cadrul fișierelor de șabloane. Când un Loop execută the_post()
, configurează variabila globală cu elementul curent.
În fișierele de șabloane, de obicei vei itera peste un Loop pentru o interogare care rulează automat. Când accesezi o singură Pagină, de exemplu, WordPress știe să ruleze o interogare pentru acea pagină și să încarce șablonul page.php
.
Dacă dorești să obții postări suplimentare în afara Loop-ului principal, de exemplu în functions.php
, vei rula propria interogare WP_Query, vei iniția Loop-ul și apoi vei folosi funcțiile de șablon. Accesează variabila globală $post
direct doar dacă nu poți obține informația dorită printr-o funcție existentă.
Când ai terminat de iterat peste propria interogare WP_Query
, vei observa că variabila globală $post
rămâne setată pe interogarea ta personalizată. De exemplu, în șablonul nostru pentru o singură pagină, după Loop-ul personalizat, s-ar putea să nu mai avem pagina curentă configurată în $post
. Poți restaura variabila globală $post
la starea ei anterioară cu wp_reset_query. Acest lucru este absolut esențial, altfel poți afecta alte plugin-uri sau teme care se așteaptă la variabila globală $post
originală.

Mulțumesc că ți-ai luat timp să îmi răspunzi, acum mi-e un pic mai clar - practic trebuie să îl folosesc doar în funcții, pentru că în general sunt în interiorul unui loop implicit sau al unei interogări personalizate.

Am scris unul sau două articole pe această temă care poate au lipsit unele informații, deoarece această întrebare abordează și alte aspecte. De asemenea, am pus o întrebare pe care o puteți consulta aici, cu un răspuns excelent de la @G.M.
Practic, variabila globală $post
este setată de $wp_query->the_post()
și este accesibilă în întregul șablon, nu doar în interiorul buclei. De aceea se numesc variabile globale.
Iată sursa actuală
3681 public function the_post() {
3682 global $post;
3683 $this->in_the_loop = true;
3684
3685 if ( $this->current_post == -1 ) // bucla tocmai a început
3686 /**
3687 * Acțiune care se declanșează odată cu începerea buclei.
3688 *
3689 * @since 2.0.0
3690 *
3691 * @param WP_Query &$this Instanța WP_Query (transmisă prin referință).
3692 */
3693 do_action_ref_array( 'loop_start', array( &$this ) );
3694
3695 $post = $this->next_post();
3696 setup_postdata($post);
3697 }
3698
De aici obțineți și răspunsul la întrebarea dumneavoastră despre motivul pentru care primiți ultimul post ca $post
pe pagina de arhivă (și orice altă pagină, de altfel). $post
este întotdeauna setat efectiv la ultimul post din array-ul $posts
returnat prin $wp_query->next_post()
.
Trebuie să fiți foarte atenți când utilizați această variabilă globală în afara buclei, deoarece interogările personalizate și unele funcții o pot accesa și îi pot modifica valoarea, așa cum este descris în postarea menționată. Acesta este unul dintre motivele pentru care ar trebui să resetați întotdeauna postdata dintr-o nouă instanță a WP_Query
. query_posts
de asemenea strică această variabilă globală, deoarece strică interogarea principală, un motiv pentru care query_posts
ar trebui evitat cu orice preț.
Practic, trebuie doar să definiți variabila globală $post
într-o funcție, deoarece aceasta se află în afara șablonului curent, dar puteți defini variabila globală și în afara buclei, dacă doriți.
În concluzie, deoarece variabila globală $post
este una dintre cele mai nesigure variabile globale care pot fi ușor modificate de funcții, aș sugera să folosiți recomandările lui @G.M. din întrebarea menționată.
