Când să folosim global $post și alte variabile globale?

5 dec. 2014, 11:44:43
Vizualizări: 64.3K
Voturi: 11

Î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

0
Toate răspunsurile la întrebare 2
2
22

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ă.

5 dec. 2014 12:48:47
Comentarii

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.

akmur akmur
5 dec. 2014 14:32:51

Mulțumesc pentru răspunsul articulat, acest lucru a fost foarte util și va continua să fie. Cea mai importantă informație de care aveam nevoie a fost "Accesează globalul $post direct doar dacă nu poți accesa informația dorită printr-o funcție existentă."

Radmation Radmation
6 apr. 2021 20:33:29
1

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ă.

5 dec. 2014 14:47:09
Comentarii

Mulțumesc, răspuns bun, nu sunt sigur pe care să-l aleg ca fiind corect, sunt la fel de bune

akmur akmur
5 dec. 2014 16:15:00