Quando usare global $post e altre variabili globali?
Sto cercando di capire quando e perché dovrei utilizzare la variabile globale $post. Ho provato a fare quanto segue in una pagina di un post, fuori dal loop, e come previsto funziona.
<?php
global $post;
echo $post->ID;
?>
Se faccio la stessa cosa in una pagina di archivio (volevo solo vedere cosa succede), per qualche motivo funziona anche lì, recuperando l'ID del post precedente, anche se ho eliminato il codice sopra dalla pagina del post precedente. È come una sorta di caching? Come funziona esattamente?
Capisco che global $post può essere utile se sto lavorando su una funzione in functions.php. È questo l'unico caso d'uso?
Grazie mille
Questa è forse una domanda troppo ampia per essere risposta in modo esaustivo. La variabile globale $post
potrebbe essere utilizzata in molti modi diversi. Se dovrebbe essere usata o meno dipende da ogni singola circostanza.
Tuttavia, per come la comprendo, lo scopo principale previsto della variabile globale $post
è il suo utilizzo nei file dei template del tema.
Quando usi the_title()
o the_content()
o the_author()
o una qualsiasi delle numerose funzioni dei template, WordPress cerca queste informazioni nella variabile globale $post
. Come regola generale, quando lavori nei file dei template, dovresti sempre utilizzare queste funzioni dei template, come get_the_ID()
, invece di accedere direttamente a $post->ID
.
Quindi, se vuoi comprendere meglio la variabile globale $post
, dovresti approfondire come funziona The Loop in WordPress, in particolare all'interno dei file dei template. Quando un Loop esegue the_post()
, sta impostando la variabile globale con l'elemento corrente.
Nei file dei template, di solito eseguirai un'iterazione su un Loop per una query che viene eseguita automaticamente. Quando accedi a una singola Pagina, ad esempio, WordPress sa di eseguire una query per quella pagina e di caricare il template page.php
.
Se vuoi recuperare post aggiuntivi al di fuori del Loop principale, ad esempio nel tuo functions.php
, dovresti eseguire la tua WP_Query, avviare il Loop e poi utilizzare le funzioni dei template. Accedi direttamente alla variabile globale $post
solo se non riesci a ottenere le informazioni che desideri attraverso una funzione esistente.
Quando hai finito di iterare sulla tua WP_Query
personalizzata, scoprirai che la variabile globale $post
è ora bloccata sulla tua query personalizzata. Quindi, ad esempio, nel nostro template di pagina singola, dopo il nostro Loop personalizzato, potremmo non avere più la pagina corrente impostata in $post
. Puoi ripristinare la variabile globale $post
al suo stato precedente con wp_reset_query. Questo è assolutamente fondamentale, altrimenti potresti interrompere altri plugin o temi che si aspettano la variabile globale $post
originale.

Grazie per aver dedicato del tempo a rispondermi, ora mi è un po' più chiaro - fondamentalmente devo usarlo solo nelle funzioni, perché generalmente sono all'interno di un loop predefinito o di una query personalizzata.

Grazie per la risposta articolata, è stata molto utile e continuerà ad esserlo. L'informazione più rilevante di cui avevo bisogno era "Accedi alla variabile globale $post direttamente solo se non riesci ad ottenere le informazioni che desideri attraverso una funzione esistente."

Ho scritto un post o due su questo argomento che forse mancavano di alcune informazioni, poiché questa domanda affronta altre questioni. Ho anche posto una domanda che puoi vedere qui con un'ottima risposta da @G.M.
In sostanza, la variabile globale $post
viene impostata da $wp_query->the_post()
ed è accessibile in tutto il template, non solo all'interno del loop. Questo è il motivo per cui si chiamano variabili globali
Ecco il sorgente attuale
3681 public function the_post() {
3682 global $post;
3683 $this->in_the_loop = true;
3684
3685 if ( $this->current_post == -1 ) // il loop è appena iniziato
3686 /**
3687 * Azione che viene eseguita all'avvio del loop.
3688 *
3689 * @since 2.0.0
3690 *
3691 * @param WP_Query &$this L'istanza di WP_Query (passata per riferimento).
3692 */
3693 do_action_ref_array( 'loop_start', array( &$this ) );
3694
3695 $post = $this->next_post();
3696 setup_postdata($post);
3697 }
3698
Da questo si ottiene anche la risposta alla tua domanda sul perché ottieni l'ultimo post come $post
nella pagina archivio (e in generale, in qualsiasi pagina). $post
è sempre effettivamente impostato sull'ultimo post nell'array $posts
restituito tramite $wp_query->next_post()
Bisogna stare molto attenti a utilizzare questa variabile globale al di fuori del loop, poiché query personalizzate e alcune funzioni possono accedervi e modificarne il valore, come descritto nel post linkato. Questo è uno dei motivi per cui dovresti sempre resettare i postdata da una nuova istanza di WP_Query
. Anche query_posts
rompe questa variabile globale poiché interrompe la query principale, un altro motivo per cui query_posts
dovrebbe essere evitato a tutti i costi
In sostanza, devi solo definire la variabile globale $post
in una funzione poiché questa si trova al di fuori del template corrente, ma puoi definirla anche al di fuori del loop se lo desideri.
Per concludere, poiché la variabile globale $post
è una delle più inaffidabili e può essere facilmente modificata da funzioni, suggerirei di seguire le raccomandazioni di @G.M. nella domanda linkata.
