Quando usare global $post e altre variabili globali?

5 dic 2014, 11:44:43
Visualizzazioni: 64.3K
Voti: 11

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

0
Tutte le risposte alla domanda 2
2
22

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.

5 dic 2014 12:48:47
Commenti

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.

akmur akmur
5 dic 2014 14:32:51

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

Radmation Radmation
6 apr 2021 20:33:29
1

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.

5 dic 2014 14:47:09
Commenti

Grazie, ottima risposta, non sono sicuro quale scegliere come corretta, sono entrambe ugualmente valide

akmur akmur
5 dic 2014 16:15:00